Где ошибка советника ?

 

CTrade  trade;

CPositionInfo myposition; 

void OnTick()
  {
   if(IsNewBar()) 
     {
       if(myposition.Select(_Symbol)==true)  //Условие 1

        {

                trade.PositionClose(_Symbol);

        }
      
      if (myposition.Select(_Symbol)==false)  //Условие 2
        {

         // Открытие сделки

        }

     } 

  }


 

Вопрос - Почему данная конструкция всегда корректно отрабатывает на тестере и никогда не отрабатывает на реале, а конкретно - никогда не заходит в Условие 2 если до этого было выполненно Условие 1 ? Т.е. другими словами почему не выполняется условие отсутствия позиции сразу же после ее закрытия путем trade.PositionClose(_Symbol) ?. Подозреваю что проблема в том что приказ не успевает исполниться к моменту проверки, но как в этом случае простроить данную конструкцию с тем же смыслом ?

 

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

а чтоб узнать есть ли позиция по данному символу, я обычно просто перебирал все позиции и если с этим символом к примеру есть позиция какой нибудь переменной отметку ставлю, а если нет то эта переменная останется без отметки и там уж думаю что дальше делать  

 
Yurij Izyumov:

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

а чтоб узнать есть ли позиция по данному символу, я обычно просто перебирал все позиции и если с этим символом к примеру есть позиция какой нибудь переменной отметку ставлю, а если нет то эта переменная останется без отметки и там уж думаю что дальше делать  

Вы абсолютно не правы.

//+------------------------------------------------------------------+
//| Access functions PositionSelect(...)                             |
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string symbol)
  {
   return(PositionSelect(symbol)); // Вот значение возвращаемое функцией.
  }

Я-бы проверил такую конструкцию

CTrade  trade;

CPositionInfo myposition; 

void OnTick()
  {
bool positionClose = false;   
if(IsNewBar()) 
     {
       if(myposition.Select(_Symbol)==true)  //Условие 1

        {

            positionClose = trade.PositionClose(_Symbol);

        }
      
      if (positionClose)  //Условие 2
        {

         // Открытие сделки

        }

     } 

  }
 
evgenykei:


 

Вопрос - Почему данная конструкция всегда корректно отрабатывает на тестере и никогда не отрабатывает на реале, а конкретно - никогда не заходит в Условие 2 если до этого было выполненно Условие 1 ? Т.е. другими словами почему не выполняется условие отсутствия позиции сразу же после ее закрытия путем trade.PositionClose(_Symbol) ?. Подозреваю что проблема в том что приказ не успевает исполниться к моменту проверки, но как в этом случае простроить данную конструкцию с тем же смыслом ?

Так код пишут только "индусы". Сравнение ==true или == false для логических выражений не нужно. По человечески код должен выглядеть примерно так:

CTrade  trade;

CPositionInfo myposition; 

void OpenPosition()
{

//тут код открытия позиции.
}

void OnTick()
  {
   if(IsNewBar()) 
     {
       if(myposition.Select(_Symbol))  //Условие 1

        {

                trade.PositionClose(_Symbol);
                OpenPosition();

        }
      
        else  //Условие 2
        {

         // Открытие сделки
            OpenPosition();

        }

     } 

  }
 
Vitalii Ananev:

Так код пишут только "индусы". Сравнение ==true или == false для логических выражений не нужно. По человечески код должен выглядеть примерно так:

А если по стратегии надо на открытии бара закрыть имеющуюся позицию и открыть новую??? Как ваш код будет обработан?

На одном баре будет закрытие и только на следующем открытие новой позиции... Не всегда ельза рулит...

 
Alexey Viktorov:

А если по стратегии надо на открытии бара закрыть имеющуюся позицию и открыть новую??? Как ваш код будет обработан?

На одном баре будет закрытие и только на следующем открытие новой позиции... Не всегда ельза рулит...

       if(myposition.Select(_Symbol))  //Условие 1

        {

                trade.PositionClose(_Symbol);//закрытие позиции
                OpenPosition();//открытие позиции

        }

А это тогда что? Вы невнимательно смотрели код. 

....

Ваш пример кода, в случае если позиций нет, вообще ни чего открывать не будет. Если ваш пример использовать, то примерно так:

CTrade  trade;

CPositionInfo myposition; 

void OnTick()
  {
bool positionClose = false;   
if(IsNewBar()) 
     {
       if(myposition.Select(_Symbol))  //Условие 1

        {

            positionClose = trade.PositionClose(_Symbol);

        }else positionClose = true;
      
      if (positionClose)  //Условие 2
        {

         // Открытие сделки

        }

     } 

  }

 P.S. Я не уверен возвращает ли функция trade.PositionClose(_Symbol) какое либо значение, если нет тогда это вообще работать не будет.

Если не хотите использовать else то можно писать так:

CTrade  trade;

CPositionInfo myposition; 

void OpenPosition()
{

//тут код открытия позиции.
}

void OnTick()
  {
   if(IsNewBar()) 
     {
       if(myposition.Select(_Symbol))  //Условие 1

        {

                trade.PositionClose(_Symbol);
                OpenPosition();

        }
      
        if(!myposition.Select(_Symbol))  //Условие 2
        {

         // Открытие сделки
            OpenPosition();

        }

     } 

  }
 
Vitalii Ananev:

А это тогда что? Вы невнимательно смотрели код. 

....

Ваш пример кода, в случае если позиций нет, вообще ни чего открывать не будет. Если ваш пример использовать, то примерно так:

 P.S. Я не уверен возвращает ли функция trade.PositionClose(_Symbol) какое либо значение, если нет тогда это вообще работать не будет.

Если не хотите использовать else то можно писать так:

Ладно, не будем мериться ... что в алгоритме знает только автор. Я не предлагал готового решения. Если писать самому, то условия подбираются согласно своего алгоритма. А тот кусок кода я понял именно так как там написано.

Условие 1 наличие позиции - закрытие этой позиции

Условие 2 успешное закрытие позиции, соответственно отсутствие оной - открытие новой

Условия отсутствия позиций вообще, в этом куске кода нет...

 
Alexey Viktorov:

Ладно, не будем мериться ... что в алгоритме знает только автор. Я не предлагал готового решения. Если писать самому, то условия подбираются согласно своего алгоритма. А тот кусок кода я понял именно так как там написано.

Условие 1 наличие позиции - закрытие этой позиции

Условие 2 успешное закрытие позиции, соответственно отсутствие оной - открытие новой

Условия отсутствия позиций вообще, в этом куске кода нет...

Да я и не мерился :) Просто почему то решил, что вы защищаете любителей писать "индусский код".
 
Vitalii Ananev:
Да я и не мерился :) Просто почему то решил, что вы защищаете любителей писать "индусский код".
А зачем навязывать собственное мнение другим? Ну хочет человек писать так, ну и пусть пишет. Когда-то придёт к пониманию, что лишнее нажатие клавки утомительно и не будет так писать. И многое другое необязательное будет опускать. Зачем такие намёки на оскорбление? Или, как минимум, неуважительное отношение к инакомыслящим.
 
Alexey Viktorov:
А зачем навязывать собственное мнение другим? Ну хочет человек писать так, ну и пусть пишет. Когда-то придёт к пониманию, что лишнее нажатие клавки утомительно и не будет так писать. И многое другое необязательное будет опускать. Зачем такие намёки на оскорбление? Или, как минимум, неуважительное отношение к инакомыслящим.
Какие оскорбления, о чем вы? Мой первоначальный комментарий предназначался топик стартеру. Вы по какой то причине на мой комментарий вставили свой необдуманный ответ, даже не соизволив нормально прочитать предложенный мной код. Не надо делать из мухи слона, надо же так загнуть  "неуважительное отношение к инакомыслящим". Вы еще меня толерантности поучите. :)
 
Vitalii Ananev:
Какие оскорбления, о чем вы? Мой первоначальный комментарий предназначался топик стартеру. Вы по какой то причине на мой комментарий вставили свой необдуманный ответ, даже не соизволив нормально прочитать предложенный мной код. Не надо делать из мухи слона, надо же так загнуть  "неуважительное отношение к инакомыслящим". Вы еще меня толерантности поучите. :)

О нём я и говорил. Было-бы это адресовано мне реакция была-бы не такая.

На ваш комментарий я не давал никакого ответа, а задал вопрос. В этом и вся разница, я задал вопрос, а вы навязывали человеку своё мнение с оценкой его способностей.