MQL4; Тренируюсь на кошках!!!

 

Всем добрый день! Помогите пробить кирпичную стену!

Задача написать советник который открывает до 100 ордеров ставит с/л. и т/п. После преодоления определенного сигнального уровня ордера модифицируются с/л. и т/р. У каждого ордера свой индивидуальный сигнальный уровень, с/л. и т/р.

С/л. и т/п. для последующей модификации, рассчитывается в момент открытия ордера.

Свою задачу я решил использовав пример с книги Сергея Ковальова. Переработал под свои идеи.

Вчера советник заработал, торгует, ставит с/л. и т/п, модифицирует сл после преодоления ценой сигнального уровня. Я думал что проблему решил, оказалась что не до конца. На тестере советник открывает где то 15-30 ордеров и модифицирует как запланировано. Потом продолжает открывать и модифицировать ордера только с/л при модификации ставит 0. Почему так происходит не понимаю.

Народ помогите найти лажу!!!

 
MauzerVII:

Всем добрый день! Помогите пробить кирпичную стену!

Задача написать советник который открывает до 100 ордеров ставит с/л. и т/п. После преодоления определенного сигнального уровня ордера модифицируются с/л. и т/р. У каждого ордера свой индивидуальный сигнальный уровень, с/л. и т/р.

С/л. и т/п. для последующей модификации, рассчитывается в момент открытия ордера.

Свою задачу я решил использовав пример с книги Сергея Ковальова. Переработал под свои идеи.

Вчера советник заработал, торгует, ставит с/л. и т/п, модифицирует сл после преодоления ценой сигнального уровня. Я думал что проблему решил, оказалась что не до конца. На тестере советник открывает где то 15-30 ордеров и модифицирует как запланировано. Потом продолжает открывать и модифицировать ордера только с/л при модификации ставит 0. Почему так происходит не понимаю.

Народ помогите найти лажу!!!

Если есть проблема с программой, то (1) её код полностью или частично сюда выложите, чтоб посмотреть или (2) с вопросом сюда.
 

Сори не успел полностью написать сообщение отвлекли.

Так вот: ниже приведен механизм учёта ордеров и их последующей модификации

  // Учёт ордеров
      ArrayCopy(Mas_Ord_Old, Mas_Ord_New);
      Qnt = 0;
      
      ArrayInitialize(Mas_Ord_New,0);
      
      for(i=0; i<=OrdersTotal(); i++)          // Цикл перебора ордер
         {
           if ((OrderSelect(i,SELECT_BY_POS) == true) && (OrderSymbol() == Symb))     //Если есть следующ ... и наша вал.пара
           {                                      // Анализ ордеров:
            Qnt++;
            Mas_Ord_New[Qnt][1] = OrderOpenPrice();
            Mas_Ord_New[Qnt][2] = OrderStopLoss();
            Mas_Ord_New[Qnt][3] = OrderTakeProfit();
            Mas_Ord_New[Qnt][4] = OrderTicket();
            Mas_Ord_New[Qnt][5] = OrderLots();
            Mas_Ord_New[Qnt][6] = OrderType();
            Mas_Ord_New[Qnt][7] = OrderMagicNumber();
            if (OrderComment()=="")
                Mas_Ord_New[Qnt][8] = 0;
            else
                Mas_Ord_New[Qnt][8] = 1;
            if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 0)
               {
                Mas_Ord_New[Qnt][9]  = Mas_Ord_Old[Qnt][9];
                Mas_Ord_New[Qnt][10] = Mas_Ord_Old[Qnt][10];
               }
            else if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 1)
               {
                Mas_Ord_New[Qnt][9]  = 0;
                Mas_Ord_New[Qnt][10] = 0;
               }
            Mas_Ord_New[Qnt][11] = Mas_Ord_Old[Qnt][11];
           }
         }                 
      Mas_Ord_New[0][0] = Qnt;
      
   // Слежение за событиями 
      
      for (int old = 1; old <= Mas_Ord_Old[0][0]; old++)
          {                    
          for (int new = 1; new <= Mas_Ord_New[0][0]; new++)
              { 
               if (Mas_Ord_Old[old][11] == 0 && Mas_Ord_New[new][11] == 0)
                  {
                   if (Mas_Ord_New[new][6] == 0)
                      {
                       if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Bid > Mas_Ord_New[new][9])
                          {
                           AnsModify = false;
                           Price = Mas_Ord_New[new][1];
                           SL    = Mas_Ord_New[new][10];
                           TP    = Mas_Ord_New[new][3];
                           Ticket= Mas_Ord_New[new][4];                       
                           Alert("???!!!! Попытка модификации Buy: Ticket: ",Ticket,"; Price: ",Price,"; SL: ",SL,"; TP: ",TP,". Ждём ответ.....");
                           for(i=0; i<=OrdersTotal(); i++)          
                              {
                               if (OrderSelect(i-1,SELECT_BY_POS)==true) /
                                 {                                       
                                  if (OrderSymbol()!=Symb)continue;      
                                  if (OrderType()>1)continue;                    
                                  if (OrderTicket()== Ticket)
                                     {                                     
                                      AnsModify=OrderModify(Ticket,Price,SL,TP,0);                   
                                      Alert("Модифицирован ордер Buy||| Ticket: ",Ticket,"; Price: ",Price,"; SL: ",SL,"; TP: ",TP);
                                      Mas_Ord_New[new][11] = 1;
                                     }
                                 }
                              }                           
                           if (AnsModify==true)
                              {
                               Print ("Функция OrderModify: Ордер № ",Ticket," модифицирован:) ПОЛУЧИЛОСЬ:)))");
                               if (OrderSelect(Ticket,SELECT_BY_POS)==true) 
                                  {
                                   Ticket_Ord =OrderTicket();                  
                                   PriceModify =OrderOpenPrice();              
                                   SL_Ord =OrderStopLoss();                
                                   TP_Ord =OrderTakeProfit();              
                                   Alert(" ПОЛУЧИЛОСЬ:))) Модифицирован ордер Buy||| Ticket: ",Ticket_Ord,"; Price: ",PriceModify,"; SL: ",SL_Ord,"; TP: ",TP_Ord);                                   
                                  }
                              }
                           else 
                              {
                               Fun_Erorr=GetLastError();
                               Print("GetLastError OP_SELL == ", Fun_Erorr);
                              }                                                        
                          }
                      }
                   else if (Mas_Ord_New[new][6] == 1)
                      {
                       if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Ask < Mas_Ord_New[new][9])
                          { ... здесь тоже самое только для ордеров sell 
                          }
                      }
                  }
              }
          }
//--------------------------------------------------------------- 5 --

Проблема выглядит так:

 
paladin80:
или (2) с вопросом сюда.
Спасибо за совет я не настолько богат, как только, так сразу и воспользуюсь!
 
MauzerVII:

Сори не успел полностью написать сообщение отвлекли.

Так вот: ниже приведен механизм учёта ордеров и их последующей модификации

Проблема выглядит так:

В вашем коде не видно размеров массивов: Mas_Ord_Old и Mas_Ord_New

Обратите внимание: переменная new выделена. Скоро в языке появится этот оператор, так что поторопитесь изменить имя переменной.

 

Возможно, ошибка в этой строке:

SL    = Mas_Ord_New[new][10];
 
PapaYozh:

В вашем коде не видно размеров массивов: Mas_Ord_Old и Mas_Ord_New

Обратите внимание: переменная new выделена. Скоро в языке появится этот оператор, так что поторопитесь изменить имя переменной.

   double
   Mas_Ord_Old[131][12],
   Mas_Ord_New[131][12];   

С начало было

   double
   Mas_Ord_Old[31][12],
   Mas_Ord_New[31][12];   

Но у меня стоит ограничение на количество одновременно открытых ордеров не больше 10

 
PapaYozh:

Возможно, ошибка в этой строке:

SL = Mas_Ord_New[new][10];


Нет там правильно. Наверное надо дать пояснения к элементам массива, и так:

            Mas_Ord_New[Qnt][1] = OrderOpenPrice();   
            Mas_Ord_New[Qnt][2] = OrderStopLoss();
            Mas_Ord_New[Qnt][3] = OrderTakeProfit();
            Mas_Ord_New[Qnt][4] = OrderTicket();
            Mas_Ord_New[Qnt][5] = OrderLots();
            Mas_Ord_New[Qnt][6] = OrderType();
            Mas_Ord_New[Qnt][7] = OrderMagicNumber();
            Mas_Ord_New[Qnt][8] = ; Определения состояния комментария - 0 нет коммента, 1 -есть (наверное надо убрать)
            Mas_Ord_New[Qnt][9]  = ; Сигнальный уровень, как только цена его пересекла должен быть модифицирован ордер
            Mas_Ord_New[Qnt][10] = ; Новый Стоп/Лосс для модифицируемого ордера 
            Mas_Ord_New[Qnt][11] = ; Индикатор модификации если = 0 то ордер можно модифицировать если = 1 то уже модифицирован и проверка поданному ордеру не производится
 

Хочу добавить,что значение для элементов массива

            Mas_Ord_New[Qnt][9]  = ; Сигнальный уровень, как только цена его пересекла должен быть модифицирован ордер
            Mas_Ord_New[Qnt][10] = ; Новый Стоп/Лосс для модифицируемого ордера 
            Mas_Ord_New[Qnt][11] = ; Индикатор модификации если = 0 то ордер можно модифицировать если = 1 то уже модифицирован и проверка поданному ордеру не производится

присваивается в момент открытия ордера и больше ни где не изменяются.

У меня возник вот такой вопрос, ордер был открыт по условиям, потом по условиям модифицирован и закрылся по с/л. или т/п. то почему на его местов массиве не происходит запись нового ордера или если ордеров не добавилось то они должны поменять свой порядковый номер: ордер № 3 закрыт ордер № 4 стал ордером № 3?

 
            else if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 1)
               {
                Mas_Ord_New[Qnt][9]  = 0;
                Mas_Ord_New[Qnt][10] = 0; 
Только этот участок кода может приводить к нулевому стоплосу. Попробуйте туда вписать что-то другое.
 
vasjos:
Только этот участок кода может приводить к нулевому стоплосу. Попробуйте туда вписать что-то другое.

Точно.

Сначала в Mas_Ord_New[new][9] пишется ноль, а потом с ним сравнивается Bid:

if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Bid > Mas_Ord_New[new][9]) 
Причина обращения: