результаты работы стоп приказов - страница 2

 
hasayama >>:

Думаю уместнее будет привести пример кода открытия и закрытия сделок. Из этого куска не понять почему он циклится.

Кстати, а зачем такие жесткие условия на выход? Не проще ли просто использовать break или тот же continue?



extern int    Period_SMA=110;              // Период SМА (розовый мувинг)
extern int    Period_EMA=110;              // Период EМА (белый мувинг)
extern int    Period_RedSMMA=21;           // Период RedSSMA (красный мувинг)
extern int    Period_GoldEMA=9;            // Период GoldEMA (золотой мувинг)
extern int    Period_OrchSMMA=9;           // Период OrchLWMA (орхидея мувинг)
extern int    SL_basic=150;                // Базовый стоп-лосс по умолчанию
extern double Lots=0.1;                    // Жестко заданное колич. лотов
bool Working=false;                        // Критерий наличия открытого ордера
bool Cls_B=false;                          // Критерий для закрытия  Buy   
bool Cls_S=false;                          // Критерий для закрытия  Sell   
bool Opn_B=false;                          // Критерий для открытия  Buy   
bool Opn_S=false;                          // Критерий для открытия  Sell
string Symb;                               // Название финанс. инструмента
//-------------------------------------------------------------------+
int start()  
 {   
  int   
  Tip,                             // Тип открытого советником ордера (B=0,S=1)
  Total,                           // Количество ордеров в окне 
  Ticket;                          // Номер ордера   
  double   
  EMA_0,                           // Значение булого мувинга на нулевом баре
  GoldEMA_0,                       // Значен. GoldEMA на нулевом баре
  GoldEMA_1,                       // Значен. GoldEMA на первом баре
  GoldEMA_2,                       // Значен. GoldEMA на втором баре
  OrchSMMA_0,                      // Значен. OrchSMMA на нулевом баре
  OrchSMMA_1,                      // Значен. OrchSMMA на первом баре
  OrchSMMA_2,                      // Значен. OrchSMMA на втором баре
  RedSMMA_0,                       // Значен. RedSSMA на нулевом баре
  SL,                              // SL выбранного ордера    
  Lot;                             // Колич. лотов в открытом советником ордере
  bool   
  Ans  =false;                     // Ответ сервера после закрытия
 
//-------------------------------------------------------------------   
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (Total==0)                          // если открытых ордеров нет (закрылся по стопу)
           {
           Working=false;                       // эксперт не работает с ордерами
           Alert("Рыночных ордеров нет. Эксперт не работает.");
           }
           
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   //-------------------------------------------------------------------   
  // Торговые критерии   
  EMA_0=iMA(NULL,0,Period_EMA,0,MODE_EMA,PRICE_CLOSE,0);               // Получение значения белого мувинга на нулевом баре    
  GoldEMA_2=iMA(NULL,0,Period_GoldEMA,0,MODE_EMA,PRICE_CLOSE,2);       // Получение значения золотого мувинга на втором баре   
  GoldEMA_1=iMA(NULL,0,Period_GoldEMA,0,MODE_EMA,PRICE_CLOSE,1);       // Получение значения золотого мувинга на первом баре    
  GoldEMA_0=iMA(NULL,0,Period_GoldEMA,0,MODE_EMA,PRICE_CLOSE,0);       // Получение значения золотого мувинга на нулевом баре    
  OrchSMMA_2=iMA(NULL,0,Period_OrchSMMA,0,MODE_SMMA,PRICE_CLOSE,2);    // Получение значения орхидеи мувинга на втором баре
  OrchSMMA_1=iMA(NULL,0,Period_OrchSMMA,0,MODE_SMMA,PRICE_CLOSE,1);    // Получение значения орхидеи мувинга на первом баре
  OrchSMMA_0=iMA(NULL,0,Period_OrchSMMA,0,MODE_SMMA,PRICE_CLOSE,0);    // Получение значения орхидеи мувинга на нулевом баре
  RedSMMA_0=iMA(NULL,0,Period_RedSMMA,0,MODE_SMMA,PRICE_CLOSE,0);      // Получение значения красного мувинга на нулевом баре
    

    if (Working==false && GoldEMA_2<OrchSMMA_2 && GoldEMA_1>OrchSMMA_1) // Если золотой мувинг пересёк орхидею снизу вверх      
      {                                     
      Opn_B=true;                                  // Критерий открытия Buy      
      }   
      
    if (Working==true && Tip==0 && Bid<=OrchSMMA_0) // Если советник открыл сигнал Buy и цена коснулась золотого мувинга     
      {                                     
      Cls_B=true;                                  // Критерий закрытия Buy      
      }   
      
    if (Working==false && GoldEMA_2>OrchSMMA_2 && GoldEMA_1<OrchSMMA_1) // Если золотой мувинг пересёк орхидею сверху вниз      
      {                                     
      Opn_S=true;                                  // Критерий открытия Sell      
      }   

    if (Working==true && Tip==1 && Ask==OrchSMMA_0) // сли советник открыл сигнал Sell и цена коснулась золотого мувинга      
      {                                     
      Cls_S=true;                                  // Критерий закрытия Sell      
      }   
      
 //-----------------------------------------------------------------
   // Закрытие ордеров   
     if (Cls_B==true)                          // Открыт ордер Buy..        
       {                                       //и есть критерий закр
        Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");         
        RefreshRates();                        // Обновление данных         
        Ans=OrderClose(Ticket,Lots,Bid,2);      // Закрытие Buy         
        if (Ans==true)                         // Получилось :)           
          {            
          Alert ("Закрыт ордер Buy ",Ticket," по цене ", Bid); 
          Working=false;           
          Cls_B=false;          
          }
        if (Ans==false)                        // Не получилось
          {            
          Alert ("Ошибка при закрытии ордера Buy ",Ticket); 
          }
       return;                                // Выход из start()        
       }       
       
     if (Cls_S==true)                          // Открыт ордер Sell..  
       {                                       // и есть критерий закр
        Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");    
        RefreshRates();                        // Обновление данных         
        Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell         
        if (Ans==true)                         // Получилось :)           
          {            
          Alert ("Закрыт ордер Sell ",Ticket," по цене ", Ask); 
          Working=false;           
          Cls_S=false;         
          }         
        if (Ans==false)                        // Не получилось
          {            
          Alert ("Ошибка при закрытии ордера Sell ",Ticket); 
          }
        return;                                // Выход из start()       
       }      
    
 //-----------------------------------------------------------------   
  // Открытие ордеров   
     
     RefreshRates();                        // Обновление данных         
 if (Opn_B==true)
  { 
   if (GoldEMA_0+2*Point<Ask && OrchSMMA_0<Ask && RedSMMA_0<Ask && EMA_0<Ask-30*Point && RedSMMA_0<OrchSMMA_0)  // Если цена пробила все 3 мувинга наверх         
     {                                                            // и вернулась к золотому мувингу, а былый выше цены на 30 пунктов
     SL=Bid-SL_basic*Point;                                       // Вычисление SL откр.         
     Alert("Попытка открыть Buy. Ожидание ответа..");         
     Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,2,SL,0);              //Открытие Buy
     Working=true;      
     Opn_B=false;      
     if (Ticket > 0)                        // Получилось :)           
       {            
       Alert ("Открыт ордер Buy ",Ticket);            
       Alert("Buy ",Ask," голд=",GoldEMA_0," орхидея=",OrchSMMA_0," сигнал=",RedSMMA_0," белій=",EMA_0);         
       return;                             // Выход из start()           
       }         
     if (Ticket==1)                      // Не получилось :(            
       {            
       Alert ("Приказ на открытие отклонён");            
       Alert("Sell ",Bid," голд=",GoldEMA_0," орхидея=",OrchSMMA_0," сигнал=",RedSMMA_0," белій=",EMA_0);         
       return;                             // Выход из start()           
       }
     }
   }             

 if (Opn_S==true)
  { 
   if (GoldEMA_0-2*Point>Bid && OrchSMMA_0>Bid && RedSMMA_0>Bid && EMA_0>Bid+30*Point && RedSMMA_0>OrchSMMA_0)  // Если цена пробила все 3 мувинга наверх         
     {                                                            // и вернулась к золотому мувингу, а былый выше цены на 30 пунктов
     SL=Ask-SL_basic*Point;                                       // Вычисление SL откр.         
     Alert("Попытка открыть Buy. Ожидание ответа..");         
     Ticket=OrderSend(Symb,OP_BUY,Lots,Bid,2,SL,0);              //Открытие Buy
     Working=true;      
     Opn_S=false;      
     if (Ticket > 0)                        // Получилось :)           
       {            
       Alert ("Открыт ордер Buy ",Ticket);            
       return;                             // Выход из start()           
       }         
     if (Ticket==1)                      // Не получилось :(            
       {            
       Alert ("Приказ на открытие отклонён");            
       return;                             // Выход из start()           
       }
     }
   }             
 //-----------------------------------------------------------------   
  return;                                      // Выход из start()  
  }
постоянно пытается закрыть ордер Buy с тикетом 0
 

Проблема известная "А был ли мальчк?"

Определяете еще одну переменную OrderExist :

bool
Ans = false, // Ответ сервера после закрытия

OrderExist = false; // Ордер существует?
В конструкции из трех операторов добавляем парочку

Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Lot =OrderLots(); // Количество лотов

OrderExist = true; // Ордер существует!

}
}
if (!OrderExist ) return;

 
данное решение не подходит, так как в таком случае советник не открывает даже первый ордер. на первой итерации он видит, что открытых позиций нет и прекращает работу
 

1. Думаю не лишним будет ввести MagicNumber для того, чтобы лучше отслеживать позиции.

2. Если ваш советник открывает и "тянет" только 1 позицию, то после того, как он нашел позицию с заданным меджиком и символом необходимо делать выход из цикла.

3. "Working==true && Tip==0 && Bid<=OrchSMMA_0" - после открытия позиции Working сразу установится в true, и если позиций больше нет, то в false так и не сбросится.

4. А что если нет позиций и ордеров? Ваш цикл пройдет, а значения переменных Tip & Ticket не изменит. Условия из пункта 3 будут соблюдены (Working = true, Tip вообще не инициализирован, а цена может и упасть ниже орхидеи), все - советник будет закрывать! А закрывать то нечего!

Следите за тем, что присваиваете Tip & Ticket (в начале старта их можно сделать -1), если Ticket <= 0 -- не выполняйте закрытие, вот и все.

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