Почему робот работает вопреки запрограмированной логике? или я туплю...

 

Результат работы

Смысл логики такой, имеется индикатор определяющий, что сейчас на рынке "флет или тренд".  Условия: при тренде продолжаем открывать ордера в направлении тренда, при флете разворачиваемся.

Кратко:

если последний ордер buy и убыточный, то:

- если индикатор флет, то открываем buy

- если индикатор тренд, то открываем sell


если последний ордер buy и прибыльный, то:

- если индикатор флет, то открываем sell

- если индикатор тренд, то открываем buy


если последний ордер sell и убыточный, то:

- если индикатор флет, то открываем sell

- если индикатор тренд, то открываем buy


если последний ордер sell и прибыльный, то:

- если индикатор флет, то открываем buy

- если индикатор тренд, то открываем sell


Так вот если посмотреть на историю торговли (картинка, комментарий отображает состояние индикатора при открытии ордера) то видно, что работает не так как нужно.

в 16:25 ордер открыт правильно

в 16:37 должен открыться ордер buy, а он открывается на продажу! Хотя согласно условию программы должен открываться именно ордер buy.

остальные ордера тоже открыты неправильно (видно из картинки)


Вот участок кода программы:

//---------------------------

string MARKETSITUATION = "NA";

if( условие ){MARKETSITUATION = "FLAT";}
if( условие ){MARKETSITUATION = "TRAND";}

GLOBAL_KOMENT = MARKETSITUATION; // комментарий при открытии ордера

string LAST_ORDER = "Нет в наличии!";
int LastiketOrder;



  // retrieving info from trade history
  int i2,accTotal=OrdersHistoryTotal();
  for(i2=0;i2<accTotal;i2++)
    {
     //---- check selection result
     if(OrderSelect(i2,SELECT_BY_POS,MODE_HISTORY)==true)
       {
       
// -- определяем прибыль или убыток последнего ордера
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER && OrderProfit() < 0){LAST_ORDER = "Убыток " + DoubleToStr(OrderProfit(),2) + " " + TimeToString(OrderCloseTime(),TIME_MINUTES); LastiketOrder = OrderTicket();}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER && OrderProfit() > 0){LAST_ORDER = "Профит " + DoubleToStr(OrderProfit(),2) + " " + TimeToString(OrderCloseTime(),TIME_MINUTES); LastiketOrder = OrderTicket();}

  

//--- действия, если последний ордер на покупку и убыточный
if(OrderTicket() == LastiketOrder && OrderProfit() < 0 && OrderType() == OP_BUY){

if(MARKETSITUATION == "FLAT"){order_buy();}
if(MARKETSITUATION == "TRAND"){order_sell();}

}

//--- действия, если последний ордер на продажу и убыточный
if(OrderTicket() == LastiketOrder && OrderProfit() < 0 && OrderType() == OP_SELL){

if(MARKETSITUATION == "FLAT"){order_sell();}
if(MARKETSITUATION == "TRAND"){order_buy();}

}


//--- действия, если последний ордер на покупку и прибыльный
if(OrderTicket() == LastiketOrder && OrderProfit() > 0 && OrderType() == OP_BUY){

if(MARKETSITUATION == "FLAT"){order_sell();}
if(MARKETSITUATION == "TRAND"){order_buy();}

}

//--- действия, если последний ордер на продажу и прибыльный
if(OrderTicket() == LastiketOrder && OrderProfit() > 0 && OrderType() == OP_SELL){

if(MARKETSITUATION == "FLAT"){order_buy();}
if(MARKETSITUATION == "TRAND"){order_sell();}

}


    }
     // работа с ордером ...
    }


//---------------------------------------


Как такое может быть? Или я чего-то уже не правильно вижу?

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

Ну не может же в комментарий при открытии ордера попадать информация изменившегося показания индикатора.... 


 
Печатайте  условия перед открытием окрытием ордера и увидите.
 
SidorOFF:
Печатайте  условия перед открытием окрытием ордера и увидите.


100 раз прочитал, не вижу, подскажите где конкретней ошибка?

 
Евгений:   комментарий отображает состояние индикатора при открытии ордера) то видно, что работает не так как нужно
 Добавьте в комментарий какой прошлый ордер был и как закрылся через пробел по 2 буквы: BY TP TRA
 
STARIJ:
 Добавьте в комментарий какой прошлый ордер был и как закрылся через пробел по 1 букве


Я вывожу на экран инфу о последнем закрытом ордере


// -- определяем прибыль или убыток последнего ордера
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER && OrderProfit() < 0){LAST_ORDER = "Убыток " + DoubleToStr(OrderProfit(),2) + " " + TimeToString(OrderCloseTime(),TIME_MINUTES); LastiketOrder = OrderTicket();}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER && OrderProfit() > 0){LAST_ORDER = "Профит " + DoubleToStr(OrderProfit(),2) + " " + TimeToString(OrderCloseTime(),TIME_MINUTES); LastiketOrder = OrderTicket();}


т.е. я вижу что последний ордер выбран правильно.

 
Евгений:

Я вывожу на экран инфу о последнем закрытом ордере

т.е. я вижу что последний ордер выбран правильно.

На экране инфа о прошлом ордере, в комментарии о тренде. Сложите всю инфу в одно место:

 Добавьте в комментарий какой прошлый ордер был и как закрылся через пробел по 2 буквы: BY TP TRA

Кстати, в этих двух строчках можно выбросить фигурные скобки. Будет нагляднее

if(MARKETSITUATION == "FLAT"){order_buy();}
if(MARKETSITUATION == "TRAND"){order_sell();}

 
STARIJ:

На экране инфа о прошлом ордере, в комментарии о тренде. Сложите всю инфу в одно место:


В комментарии инфа о тренде на момент открытия ордера т.е. что показывал индикатор на момент открытия ордера. Комментарий  закрытого ордера не как не влияет на открытие последующего.  

 
Евгений:


В комментарии инфа о тренде на момент открытия ордера т.е. что показывал индикатор на момент открытия ордера. Комментарий  закрытого ордера не как не влияет на открытие последующего.  

При чем здесь влияние? Если вся инфа будет в комментарии в одном месте - проще будет анализировать происходящее

Добавьте в комментарий какой прошлый ордер был и как закрылся через пробел по 2 буквы: BY TP TRA

 
STARIJ:

При чем здесь влияние? Если вся инфа будет в комментарии - проще будет анализировать происходящее

Добавьте в комментарий какой прошлый ордер был и как закрылся через пробел по 2 буквы: BY TP TRA


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

p/s.  вообще мне кажется лучше анализировать последнее движение цены, а от анализа ордеров отказаться.

 
Евгений:  может и так.  но разве в комментарии будет написано что-то другое чем то что на экране?
Вот и проверьте. Кстати, какой индикатор тренда используете?
 
STARIJ:
Вот и проверьте.


 Может попробую,  но скорее буду определять по цене куда и от куда она двигалась в пределах заданных пунктов.


STARIJ:
Кстати, какой индикатор тренда используете?


  Самописный. Пока только тестирую... не факт, что будет  что-то стоящее. Задумывалось вообще одно, а потом решил проверить им другое.

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