Блог им. roev_ae

help with wealth-lab 4

Добрый вечер ув. форумчане.
Давно не писал ничего в велс-лабе 4
Сейчас столкнулся с проблемой — допустим у меня есть 4 активные позиции, мне надо закрыть их по частям. Я пишу:
if (условие 1) then SellAtMarket(Bar+1,? ,'');
...
if (условие 4) then SellAtMarket(Bar+1,? ,''); 

Что надо написать, чтобы закрывала только последнюю еще активную позицию, а не все разом?

Вопрос вроде не сложный, если кто активно занимается, напишите пожалуйста.
Заранее спасибо. 
16 комментариев
sellatclose(bar, номер позиции,"") как то так.
avatar
nfxzhzh, Как узнать номер?
Есть ф-я перебора по всем позициям PositionCount
Я пишу:
for i := PositionCount — 1 downto 0 do
begin
if PositionActive( i ) then
begin
SellAtMarket( Bar + 1, i, '' );
end;
Но закрываются также все позы
roev_ae, не надо узнавать, запоминайте когда открываете позицию в переменную т е что то типа

условие входа
buyatclose(bar,"");
запоминаем номер крайней открытой позиции в переменную pos1

попробую код поискать щас
avatar
pos1:=lastposition;
avatar
nfxzhzh, сча попробую, выглядит. как то что надо)
Ещё можно глянуть в хэлпе WL функцию SplitPosition
avatar
alt, ф-ию нашел, спасибо
alt, если позиция одна то да но по условиям
«допустим у меня есть 4 активные позиции»
тут не надо сплитить
avatar
nfxzhzh, не выходит, пишу:
BuyAtMarket(Bar+1,'one');
pos1:=LastPosition;

BuyAtMarket(Bar+1,'four');
pos4:=LastPosition;

SellAtLimit(Bar+1,fProfitPrice1,pos1,'profit1')

SellAtLimit(Bar+1,fProfitPrice4,pos4,'profit1')

проходит одной пачкой
При чем даже если:
BuyAtMarket(Bar+1,'one');
pos1:=LastPosition;

BuyAtMarket(Bar+1,'four');
pos4:=LastPosition;

SellAtLimit(Bar+1,fProfitPrice1,pos1,'profit1')
Тоже самое, т.е. pos1 кроет всю позу
roev_ae, сейчас не могу проверить но вообще Вы покупаете на следующем баре и позиция еще не открыта.

А Вы тестируете с какими настройками, на сделку 1 лот или процент от капитала какой нибудь?

Завтра попробую код прислать.
avatar
nfxzhzh, Да наверно из-за бар+1 так.
захожу 4 раза по 20% от эквити

Было бы круто посмотреть на работающий участок кода, где это реализовано, спасибо
roev_ae, вот по закрытиям как то так

var Bar: integer;
var pos1position, pos1num, pos2position, pos2num, pos3position, pos3num: integer;

pos1position:=0;
pos2position:=0;
pos3position:=0;

for Bar := 20 to BarCount — 1 do begin

{position1}
case pos1position of
0:
begin
if priceclose(bar)>priceclose(bar-1) then begin
buyatclose(bar,'le1');
pos1position:=1;
pos1num:=lastposition;
end;
end;
1:
begin
if priceclose(bar)<priceclose(bar-1) then begin
sellatclose(bar,pos1num,'lx1');
pos1position:=0;
end;
end;
end;

{position2}
case pos2position of
0:
begin
if priceclose(bar)>priceclose(bar-2) then begin
buyatclose(bar,'le2');
pos2position:=1;
pos2num:=lastposition;
end;
end;
1:
begin
if priceclose(bar)<priceclose(bar-2) then begin
sellatclose(bar,pos2num,'lx2');
pos2position:=0;
end;
end;
end;

{position3}
case pos3position of
0:
begin
if priceclose(bar)>priceclose(bar-3) then begin
buyatclose(bar,'le3');
pos3position:=1;
pos3num:=lastposition;
end;
end;
1:
begin
if priceclose(bar)<priceclose(bar-3) then begin
sellatclose(bar,pos3num,'lx3');
pos3position:=0;
end;
end;
end;

end;
avatar
roev_ae, с лимитами у Вас 3 варианта получается навскидку.

1.переделать на торговлю на bar а не на следующем. Проверять исполняется ли условие pricelow(bar)<limit(bar-1) и тогда считать что лимит исполнен и считать позицию открытой.

2.подглядывать исполняется ли условие на следующем баре pricelow(bar+1)<limit

3.использовать bar+1 и на следующем баре смотреть pricelow(bar)<limit(bar-1)

Первый вариант попроще но надо рассчитывать все уровни и условия на предыдущий бар.
avatar
ну и по сайзу позиций попробуйте отладить сначала торговлю одним лотом, с долей капитала может в какой то момент не хватать (купили 2, в просадке и на 3 не хватает).
avatar
nfxzhzh, спасибо, все разжёвано, попробую сегодня обязательно

теги блога Андрей Роев

....все тэги



UPDONW
Новый дизайн