Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 869

 

В догонку: позиции БАЙ (как и  СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на  каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.

Как это передать на языке МКЛ? 

 
rapid_minus:

В догонку: позиции БАЙ (как и  СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на  каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.

Как это передать на языке МКЛ? 

Выбираем ордер в цикле. Если это Бай, и остальные данные (символ, магик, ещё чего-нить) соответствуют критерию того, что вот его-то и нужно закрывать при "своих условиях закрытия", то закрываем его, если "свои условия закрытия" имеют место быть.
 
artmedia70:
Выбираем ордер в цикле. Если это Бай, и остальные данные (символ, магик, ещё чего-нить) соответствуют критерию того, что вот его-то и нужно закрывать при "своих условиях закрытия", то закрываем его, если "свои условия закрытия" имеют место быть.

Немного туманно для меня, но, поковырявшись,думаю пойму. Большое спасибо за то, что не отвернулись и не поучаете с вершин познания, как некоторые товаристчи из страны Советов.

Я додумался закрывать так:

//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 

                                                      

                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)

   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));

   

        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------

    

    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...

     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)

        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)

       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)

         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)

       

       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               

   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");

   if (Ans==true)                                     // Получилось :)

        {

         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");

         break;                                       // Выход из цикла закрытия позиции

        }


     } 

 

Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо! 

 
//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 
                                                      
                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)
   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));
   
        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------
    
    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...
     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)
        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)
       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)
         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)
       
       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               
   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");
   if (Ans==true)                                     // Получилось :)
        {
         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");
         break;                                       // Выход из цикла закрытия позиции
        }

     }
Так гораздо легче читать. Извините.
 
rapid_minus:

Немного туманно для меня, но, поковырявшись,думаю пойму. Большое спасибо за то, что не отвернулись и не поучаете с вершин познания, как некоторые товаристчи из страны Советов.

Я додумался закрывать так:

...

 

Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо! 

Ну как-то субмурно всё у вас.

1. Определяете факт наступления условия для закрытия ордера Buy

2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.

Вот пример цикла:

void ClosePositions(string symbol, int type, int magic) {
   for(int i=OrdersTotal()-1; i>=0; i--) {      // цикл по открытым ордерам
      if(OrderSelect(i,SELECT_BY_POS)) {        // выбираем ордер по индексу
         if(OrderMagicNumber()!=magic) continue;// если магик не искомый - ищем дальше
         if(OrderSymbol()!=symbol)     continue;// если символ не тот - ищем дальше
         if(OrderType()!=type)         continue;// если тип ордера не тот - ищем дальше
         // здесь, если ордер выбран, то он соответствует нужным критериям,
         // вызов функции закрытия выбранного ордера по тикету
         }
      }   
   }

Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:

ClosePositions(Symbol(),OP_BUY,100500);

Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic

В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();

 
rapid_minus:
Так гораздо легче читать. Извините.

Есть ещё возможность править старый пост, чтобы не плодить дубли ;)

 
evillive:
Есть ещё возможность править старый пост, чтобы не плодить дубли ;)
Попытался, но SRC уже не вставляет.
 
artmedia70:

Ну как-то субмурно всё у вас.

1. Определяете факт наступления условия для закрытия ордера Buy

2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.

Вот пример цикла:

Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:

Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic

В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();


Спасибо. Но как я понял, магик присваивается автоматически при открытии ордера. Поэтому по магику я не могу определить, на каких условиях открыт ордер, и, соответственно, не знаю, по каким условиям его закрывать.
 
rapid_minus:
Спасибо. Но как я понял, магик присваивается автоматически при открытии ордера. Поэтому по магику я не могу определить, на каких условиях открыт ордер, и, соответственно, не знаю, по каким условиям его закрывать.
магиков может быть сколько угодно много, для каждого условия - свой.
 

Добрый день!

int ret_code=0;
int somefunc()
  {  
   ...
   return(ret_code);
  }

 ret_code локальная переменная или глобальная переменная? ret_code сбрасывается после перезапуска терминала?