Закрытие половинных участков. - страница 13

 
Извините, но я не понимаю, как это может мне помочь. Неважно, что происходит в цикле for и какой void вызывается. Речь идет о том, что я первым вызываю в "int start()", не так ли?

Как я уже писал выше, если я половиню заказ, неважно, что это за OrderTicket(), ЛЮБОЙ открытый "OP_BUY" будет вызываться снова и снова?

Мне нужен способ написать код так, чтобы внутри "in start()" и этого кода выше, он НЕ продолжал вызывать "OP_BUY" каждый раз ПОСЛЕ того, как он уже закрыл одну половину?
 
DomGilberto:
Извините, но я не понимаю, как это вообще может мне помочь. Неважно, что происходит в цикле for и какой void вызывается. Важно, что я сначала вызываю в "int start()", не так ли?

Как я уже писал выше, если я половиню заказ, неважно, что это за OrderTicket(), ЛЮБОЙ открытый "OP_BUY" будет вызываться снова и снова?

Мне нужен способ написать код так, чтобы внутри "in start()" и этого кода выше, он НЕ продолжал вызывать "OP_BUY" каждый раз ПОСЛЕ того, как он уже закрыл одну половину?

Вызываемая пустота - это просто функция, которая вызывается из start() ... это то же самое, как если бы код был непосредственно в start().

псевдокод:

ищем OP_BUYs

если найдены - находится ли TP на BE?

если TP не на BE и Bid >= первой цели, переместите TP на BE и закройте половину ордера.

если TP находится на BE, ничего не делать

 

ДА!!! Спасибо RaptorUK!

Извините, я не так глуп, как меня выставляют, вы знаете ;) - Просто иногда мне нужно немного повторить, когда я в чем-то новичок...

Я понял, что все говорили мне об этом уже несколько страниц назад - я извиняюсь, что не понял или не уловил этого!


ПРАВДА! Нам наконец-то удалось закрыть половину, выйти на безубыточность и остановить постоянное закрытие половинок по одной и той же цене :D! Так что все практически идеально!!!

Все, что я собираюсь сделать сейчас, это скопировать и вставить это для моих других выходов, изменить несколько правил и все! Бобс твой дядя = все готово :)

Я выложу все это здесь, чтобы другие могли использовать, если захотят - В конце концов, много терпения со стороны других позволило мне не только закодировать это, но и понять это :)

 
Это странно - иногда, когда я делаю бэктест, полузакрытие @ 1:1 не работает, но затем, когда я делаю более короткий бэктест, оно работает? Странно... это потому что тестер стратегий - дерьмо, или у меня есть недостаток в коде?
 
О, и что можно предложить делать, если цена не достигает первой цели 1:1, но стоплосс больше, чем вход....? Как бы я тогда создал правило вокруг этого.....
 
DomGilberto:
И что можно сделать, если цена не достигает первой цели 1:1, но стоплосс больше, чем вход....? Как бы я тогда создал правило вокруг этого.....


Когда вы модифицируете стоплосс до безубытка?

если цель не достигнута, сделка будет закрыта по OrderStopLoss()

 
deVries:


Когда вы модифицируете ордер до безубытка?

если цель не достигнута, сделка будет закрыта по OrderStopLoss()


Я закрываю половину с помощью OrderClose() и если это возвращает true, то я вызываю безубыток, чтобы переместить стоплосс в безубыток? Таким образом, остальная часть открытой позиции в лотах не будет постоянно закрываться, потому что если позиция была перемещена в безубыток, то я написал, что больше не будет закрытия этой позиции, пока она не достигнет своей фиксированной цены тейк-профита 1:2.

Однако некоторые сделки будут равны входу или выходить за пределы безубыточности ДО того, как сделка достигнет первой цели, НЕ вызывая полузакрытия...

Кроме того, на некоторых сделках полувыход из сделки и затем переход в безубыток работает отлично.... на некоторых сделках, на которых он должен работать, он ничего не делает? Может ли это быть связано с плохими данными и недостатком тестера стратегий, или это несоответствие с моим кодом?

О, и я все еще получаю OrderModify 1 - чертовски раздражает...

 

Как вы идентифицируете ордер после его частичного закрытия, чтобы затем изменить SL для безубыточности? Вы же знаете, что не можете использовать оригинальный номер билета? При частичном закрытии ордера первоначальный номер тикета закрывается. Оставшейся части присваивается новый номер билета. Один из способов определить это - получить OrderOpenTime() перед частичным закрытием. После частичного закрытия заказа оставшаяся часть получит новый номер билета, но OrderOpenTime() будет таким же, как и раньше.

Вы также можете использовать OrderOpenTime() для идентификации заказа и предотвращения его повторного закрытия.

В качестве альтернативы вы можете изменить его перед частичным закрытием. Оставшаяся часть вашего ордера сохранит измененный SL или TP.

Вот тест. Открыт по 0.09, частично закрыт по 0.07, осталось 0.02.

Обратите внимание, как меняется номер тикета, но время открытия остается прежним:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Алерт: Билет 14 OrderOpenTime до закрытия части: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Предупреждение: Билет 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242

 
SDC:

Как вы идентифицируете ордер после его частичного закрытия, чтобы затем изменить SL для безубыточности? Вы же знаете, что не можете использовать оригинальный номер билета? При частичном закрытии ордера первоначальный номер тикета закрывается. Оставшейся части присваивается новый номер билета. Один из способов определить это - получить OrderOpenTime() перед частичным закрытием. После частичного закрытия заказа оставшаяся часть получит новый номер билета, но OrderOpenTime() будет таким же, как и раньше.

Вы также можете использовать OrderOpenTime() для идентификации заказа и предотвращения его повторного закрытия.

В качестве альтернативы вы можете изменить его перед частичным закрытием. Оставшаяся часть вашего ордера сохранит измененный SL или TP.

Вот тест. Открыт по 0.09, частично закрыт по 0.07, осталось 0.02.

Обратите внимание, как меняется номер тикета, но время открытия остается прежним:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Алерт: Билет 14 OrderOpenTime до закрытия части: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alert: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242


Замечательно, спасибо. Я совсем забыл про OrderOpenTime() - это отличный способ сделать это! Спасибо за совет - теперь я буду экспериментировать с этим.

Следуя предыдущему сообщению, мне удалось добиться того, что теперь все работает гораздо более гладко - ошибка 1 OrderModify выскакивает очень редко. Кажется, что теперь все работает более гладко.

Единственная проблема заключается в том, что если у меня есть сделка, где стоп-лосс >= чем OrderEntry() - (предполагая, что мы говорим о лонге), то он не закроет половину ордера, потому что главный критерий для закрытия половины не был выполнен.

Вот этот код здесь инициирует закрытие половины лотов, и остановку непрерывного закрытия половин по одной и той же цене - (Это не единственная вещь в "in start()", просто так легче увидеть):



   

int start()
{

   if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
      {
      if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
         {
         CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }
      
      if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
         {
         CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }   
      } 
}
Как мне включить функцию OrderOpenTime(), чтобы иметь лучший контроль над тем, чтобы каждая сделка закрывалась половиной лота 1:1 БЕЗ пропусков, где стоп IS >= OrderOpen()?
 

Есть несколько способов убедиться, что каждый ордер частично закрыт, мой любимый способ - изменить TP на один пункт, когда я частично закрываю ордер.

Например, мне нужен ТП в 100 пунктов, поэтому я открываю ордер с ТП в 99 пунктов. Я знаю, что до достижения тейк-профита мой ордер будет частично закрыт на 40 пунктов. Когда это произойдет, я изменю TP до 100 пунктов. Таким образом, любой ордер, имеющий прибыль >= 40 пунктов и TP < 100 пунктов, должен быть частично закрыт. Любой ордер с TP > 99 пунктов уже был частично закрыт. Если вы сделаете это таким образом, то не будет разницы, какой SL. Просто убедитесь, что вы нормализуете все двойные цены ордеров, прежде чем производить расчеты по ним.

Причина обращения: