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

 
Хорошо, я немного продвинулся. Но у меня есть проблема. Если я размещаю ордер в первый раз на любой паре, он НЕ закроет половину ордера, ЕСЛИ у меня нет сделки, с которой можно сравнить в истории... В этом случае, если первая сделка прошла 1:1, он не закроет половину позиции, поскольку ему не с чем сравнивать в историческом пуле... Аналогично, я не совсем понимаю, что я делаю неправильно, но даже когда в истории есть сделка, с которой можно сравнить (OrderOpenTime()), он все равно постоянно закрывает ее по той же цене?

int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
   OrderEntryTime            = OrderOpenTime();
   datetime OrderEntryClosed = OrderCloseTime(); 
    CurrentSymbol            = OrderSymbol();
     if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
         {   
         Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
         Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));  
         }
         
  if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
     {
      // Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
     CheckHistoricalTrades(); 
     }
   }
}
}  
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--) 
    {
     if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)  
        &&  OrderMagicNumber()  == MagicNumber            
        &&  CurrentSymbol       == Symbol()            
        &&  OrderType()         <= OP_SELL
        &&  OrderEntryTime    >  OrderOpenTime() && OrderType()==OP_BUY)
          {
          Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                  " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
          CloseHalfOrder();
          }
                if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
                  {
                  Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                     " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
                  CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in. 
                  }
                      
     }
}  
Я знаю, что проблема стоит прямо передо мной, но я не могу ее увидеть...
 
Это отпечатки из журнала - некоторые отпечатки не показаны выше - но все вышеперечисленные показаны.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.04 09:22 Was not the same as current order: 2010.02.25 01:16 //>>> "Last Order Open time" here doesn't make sense?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.05 15:07 //>>> This is the same as "The Last Order Open Time"?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637  //>>> Therefore, it closed it here.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676     //>>> The ask is at the OrderClose() price.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.676
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 10
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.030
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.05 15:07 Was not the same as current order: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Open Time of this order was: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Selected Order GBPJPY matches this pair: GBPJPY
 
DomGilberto:

Однако у меня есть проблема; я пытаюсь частично закрыть один и тот же "OP_BUY" или "OP_SELL" до 4 раз по разным ценам... Я думаю, что вопрос, который я должен задать, заключается в том, могу ли я получить способ, при котором у меня есть правило, что ВСЕ частичные закрытия (любых лотов и цен на ОДНОЙ данной сделке) будут частично закрываться только ОДИН раз при заданных параметрах "OrderClose()"...

Этот способ, который я рассматриваю сейчас, с сопоставлением OrderOpenTime(), по сути, будет работать только один раз, и будет ограничивать любой другой тип функции OrderClose()... Я хочу найти способ, чтобы одно правило применялось к 4 функциям OrderClose()... (если это имеет смысл?)

Я знаю, что люди предлагают открыть 4 ордера, но, не вдаваясь в подробности, для меня это менее эффективно.

Почему бы просто не иметь двумерный массив, который хранит номер билета и количество доступных частичных закрытий, которые осталось выполнить.

Схема/псевдокод:

1. определите статический двумерный массив: cOrders[][2].

2. для каждого нового введенного заказа: изменить размер первого измерения cOrders на size+1, поместить номер билета нового заказа в [x][0] и количество оставшихся частичных закрытий (в данном случае 4) в [x][1].

3. через любой промежуток времени (например, каждый start()) просмотреть массив, выбрать каждый ордер по сохраненному номеру билета и определить, нужно ли выполнить частичное закрытие.

4. если необходимо выполнить частичное закрытие (см. шаг 3), частично закройте заказ с помощью OrderClose() и обновите cOrders[x][0], чтобы отразить новый номер билета и уменьшить cOrders[x][1] на 1.

5. удалите из cOrders все ордера, которые были закрыты или количество оставшихся частичных закрытий которых равно 0.

Единственный вопрос - что делать при перезагрузке платформы/компьютера. Можно хранить эту информацию в файле и считывать ее в init() при перезагрузке платформы.

 
Thirteen:

Почему бы просто не иметь двумерный массив, который хранит номер билета и количество доступных частичных закрытий, которые осталось выполнить.

Схема/псевдокод:

1. определите статический двумерный массив: cOrders[][2].

2. для каждого нового введенного заказа: изменить размер первого измерения cOrders на size+1, поместить номер билета нового заказа в [x][0] и количество оставшихся частичных закрытий (в данном случае 4) в [x][1].

3. через любой промежуток времени (например, каждый start()) просмотреть массив, выбрать каждый ордер по сохраненному номеру билета и определить, нужно ли выполнить частичное закрытие.

4. если необходимо выполнить частичное закрытие (см. шаг 3), частично закройте заказ с помощью OrderClose() и обновите cOrders[x][0], чтобы отразить новый номер билета и уменьшить cOrders[x][1] на 1.

5. удалите из cOrders все ордера, которые были закрыты или количество оставшихся частичных закрытий которых равно 0.

Единственный вопрос - что делать при перезагрузке платформы/компьютера. Можно хранить эту информацию в файле и считывать ее в init() при перезагрузке платформы.

Я думаю, что проще всего это сделать с помощью магических номеров ... использовать части номера для определения различных параметров, например: количество деталей, номер заказа, день, месяц, номер эксперта ... все детали будут иметь одинаковый магический номер и могут быть легко отслежены в истории. Я предполагаю, что закрытая часть и открытая часть слева имеют одинаковый магический номер. ...
 
Да, я так думаю. Магическое число всегда одно и то же "1234"?

Я понятия не имею, как использовать части магического числа для определения различных параметров? Я думаю, что использование OrderOpenTime() не будет логичным маршрутом... Не могу поверить, насколько длинной становится эта тема. Лол.

Клянусь богом, я собираюсь сделать тему по этому вопросу, как только я (с большой помощью всех остальных!) разгадаю его.
 
RaptorUK:
Я думаю, что проще всего это сделать с помощью магических номеров ... использовать части номера для определения различных параметров, например: количество частей, номер заказа, день, месяц, номер эксперта ... все части будут иметь один и тот же магический номер и могут быть легко отслежены в истории. Я предполагаю, что закрытая часть и открытая часть слева имеют одинаковый магический номер. ...

Использование магического числа для кодирования частей информации вполне возможно, но я вижу несколько возможных ограничений. Во-первых, магическое число - это int и поэтому имеет длину 10 цифр, где крайняя левая цифра может быть только 1 или 2 (а если крайняя левая цифра - 2, то вторая по левому краю цифра должна быть 7 или меньше). Во-вторых, может потребоваться больше времени на start() для просмотра всей истории, чтобы найти все части каждого заказа, чтобы определить, нужно ли (или можно ли) частично закрыть текущий заказ. Просто не уверен, будет ли это большее время тривиальным или нет.

 

Подождите, а разве я не могу иметь несколько MagicNumber? Использовать один для начального OrderSend(), один для OrderModify(), после того, как половина позиции закрыта по первой цели 1:1, модифицировать ордер, чтобы изменить MagicNumber? Таким образом, когда я сначала хочу закрыть половину позиции на 1:1, она будет закрываться только на 1:1, пока текущий открытый "OP_BUY" соответствует магическому числу, которое я дал ей сначала? После того, как он частично закроется, модифицировать и изменить это магическое число?!

Лол? Разве это не очень просто?!

UPDATE: Мне явно нужно прекратить смотреть на это сегодня - вы не можете изменить MagicNumber - хотя, блин, хотелось бы... (facepalm) - Можете себе представить, насколько все это было бы проще...

 
DomGilberto:
Подождите, разве я не могу иметь несколько магических номеров? Использовать один для начального OrderSend(), один для OrderModify(), после того как половина позиции будет закрыта по первой цели 1:1, модифицировать ордер, чтобы изменить MagicNumber? Таким образом, когда я сначала хочу закрыть половину позиции на 1:1, она будет закрываться только на 1:1, пока текущий открытый "OP_BUY" соответствует магическому числу, которое я дал ей сначала? После того, как он частично закроется, модифицировать и изменить это магическое число?!

Лол? Разве это не очень просто?!

Нет. Во-первых, после первоначального OrderSend() вы не можете добавить/изменить Magic Number с помощью OrderModify(). Во-вторых, когда вы делаете частичное закрытие ордера с помощью OrderClose(), новый ордер (я предполагаю) получает тот же магический номер, что и старый.

 
Thirteen:

Нет. Во-первых, после первоначального OrderSend() вы не можете добавить/изменить Magic Number с помощью OrderModify(). Во-вторых, когда вы делаете частичное закрытие ордера с помощью OrderClose(), новый ордер (я предполагаю) получает тот же магический номер, что и старый.


Да. Я понял, насколько я отсталый. Долгий день!

Да, после первого частичного закрытия оставшейся позиции присваивается тот же магический номер, с которым она начинала.

Это меня очень расстраивает... Если бы я только мог изменить magicnumber, это было бы слишком просто!? Должен быть логичный способ частично закрыть позицию ОДИН раз - и сделать это несколько раз по любой заданной предопределенной цене, указанной в OrderClose() - Должно быть обновление, позволяющее нам изменять MagicNumber()!
 

Вы совсем не мыслите логически.

1. Как модификация магического числа поможет вам больше, чем знание OrderOpenTime()? Это то же самое, что и идентификатор ордера.

2. зачем вы конвертируете его в формат день/час/минута с помощью timetostr? OrderOpenTime() уже в формате timestamp выглядит следующим образом: 1375356521 он представляет собой точное время с точностью до секунды, когда был открыт ордер.

Если бы вы могли изменить магическое число, вы бы сравнили магическое число ордера, чтобы убедиться, что у него нет магического числа, которое означает, что он уже был частично закрыт, верно?

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

static datetime alreadypartclosed;

если закрытие заказа прошло успешно

alreadypartclosed = OrderOpenTime();

если заказ соответствует критериям для частичного закрытия

if(OrderOpenTime() != alreadypartclosed )

Если вы управляете несколькими открытыми ордерами одновременно, используйте массив[] для хранения временных меток закрытых ордеров.

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