Скачать MetaTrader 5

Помогите, пожалуйста, господа специалисты

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114287
Forex Trader  
Основная задача -- отложить стоп ордер и, в случае, если цена пошла в протвоположную сторону подтягивать его за ценой. Но есть один ньюанс... Если ранее уже был выставлен короткий (длинный) ордер, то поверх него уже не откладывать (т.е. по той же цене). И вот представьте себе.. Не работает! Может я чего-то не доглядел? В первоначальном варианте скрипта была еще одна (дополнительная) проверка. Но я ее здeсь не выкладываю, чтобы лишний раз не путать. Ибо все одно не работал експерт.


extern    int step = 10,                            // шаг 
                 slippage = 5,                        // ну, это понятно
                 sim = 3;                              // переменная, округляющая символ для 
                                                           // того, чтобы шаги были исключительно
                                                           // на круглых значениях (это блажь)
              
//---- Локальные переменные (не обновляющиеся)
       double lots = 0.1;
                              
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
  
//---- Локальные переменные (обновляющиеся)
 
   int   cnt,                            // счетчик 
         ticket,                         // переменная для работы с ордерами        
         total;                          // total он и есть total
         
  bool   opSell,opBuy,                   // Наличие отложенных ордеров 
         Buy = true,                     // Разрешают отложить ордер (запрещают, если 
         Sell = true;                    // на этом шаге ордер уже открыт)  
                                                  
for(cnt = 0; cnt < total; cnt++)
 {
  if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
   {    
    if(OrderSymbol() == Symbol())
     {    
      if(OrderType() == OP_SELL)      
       {    
        if(OrderOpenPrice() == NormalizeDouble(Bid,sim) - step*Point)
         Sell = false;    // Запрещаем откладывать короткий ордер на это место -- ибо занято
       }     
      if(OrderType() == OP_BUY)
       {
        if(OrderOpenPrice() == NormalizeDouble(Ask,sim) + step*Point)
          Buy = false;     // Запрещаем откладывать длинный ордер на это место -- ибо занято
       } 
     } 
   } 
 } 

//---- Проверка на наличие отложенного ордера. Подтягивание

for(cnt = 0; cnt < total; cnt++)
 {
  if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) == true)
   {    
    if(OrderSymbol() == Symbol())
     {    
      if(OrderType() == OP_SELLSTOP)      
       {
                     // Теперь, если надо (и если можно), будем подтягивать ордер за ценой
        opSell = true;          // стало быть отложенный ордер существует                 
        if(OrderOpenPrice() < Bid - 2*step*Point 
           && Sell == true )                                    
         {
          OrderModify(OrderTicket(),NormalizeDouble(Bid,sim) - step*Point,0,0,0,Red);  
          return(0);
         }
       }     
      if(OrderType() == OP_BUYSTOP)
       {
                   // Теперь, если надо (и если можно), будем подтягивать ордер за ценой
        opBuy = true;   
        if(OrderOpenPrice() > Ask + 2*step*Point 
           && Buy == true)                                      
         {
          OrderModify(OrderTicket(),NormalizeDouble(Ask,sim) + step*Point,0,0,0,LightBlue);  
          return(0);
         }
       } 
     } 
   } 
 }
                        //-- Выставление отложенных ордеров (если можно)
if(opSell == false                    // если отложенного SELL ордера пока нет 
&& Sell == true )                    // и если на том месте, куда мы собираемся его 
                                            // отложить уже не открыт короткий ордер 
 {
  ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,
  NormalizeDouble(Bid,sim) - step*Point,0,0,0,NULL,0,0,Red);
  if(ticket<0)
   Print("Error opening SELL order &&&&&&&&&&&&&&&&&&&:",GetLastError());   
  return(0);
 }
if(opBuy == false                   // если отложенного BUY ордера пока нет 
&& Buy == true)                    // и если на том месте, куда мы собираемся его 
                                            // отложить уже не открыт длинный ордер 
 {
  ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,
  NormalizeDouble(Ask,sim) + step*Point,0,0,0,NULL,0,0,LightBlue);
  if(ticket<0)
   Print("Error opening SELL order &&&&&&&&&&&&&&&&& : ",GetLastError()); 
  return(0);
 } 
 
//---- Конец проверки на наличие отложенных ордеров. И подтягивания.

 return(0);
}                          // конец функции Start 



Подскажите, что не так. Пожа-а-а-алуйста..

P.S.: к сожалению местный редактор всю табуляцию посдвигал... так что читать не очень удобно

Forex Trader
114287
Forex Trader  
P.S.: к сожалению местный редактор всю табуляцию посдвигал... так что читать не очень удобно


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