Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись знаниями. Стань популярным разработчиком!
evgenykei
43
evgenykei 2016.06.15 22:55 

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
15175
Yurij Izyumov 2016.06.15 23:31  

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

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

Alexey Viktorov
5181
Alexey Viktorov 2016.06.16 09:22  
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
        {

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

        }

     } 

  }
Vitalii Ananev
7195
Vitalii Ananev 2016.06.16 09:23  
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();

        }

     } 

  }
Alexey Viktorov
5181
Alexey Viktorov 2016.06.16 09:32  
Vitalii Ananev:

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

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

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

Vitalii Ananev
7195
Vitalii Ananev 2016.06.16 09:45  
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();

        }

     } 

  }
Alexey Viktorov
5181
Alexey Viktorov 2016.06.16 10:10  
Vitalii Ananev:

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

....

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

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

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

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

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

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

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

Vitalii Ananev
7195
Vitalii Ananev 2016.06.16 10:20  
Alexey Viktorov:

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

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

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

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

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

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

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

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий