Учусь писать советника... - страница 7

 

И ещё, правильно-ли я проверяю состояние стопа по трем критериям?

  //проверяем если есть поза, стоит стоп и не стоит БУ        
       if ((OrdersTotal()>0)&& (OrderStopLoss()!=0) && (OrderStopLoss()!= SLBU))
            ModifySLinBU();   //передаем управление в ф-ю установки БУ

или так

  //проверяем если есть поза, стоит стоп и не стоит БУ        
       if ((OrdersTotal()>0)&& (OrderStopLoss()!=0 && SLBU))
            ModifySLinBU();   //передаем управление в ф-ю установки БУ
 

Подскажите практиковалось-ли тут на форуме такое как "сдвиг" периода?

Объясняю.. Например свечи H4 у всех ДЦ разные, это понятно - т.к. время сервера разное. Как можно сдвигать ети свечи по времени, чтобы получать на выходе другие характеристики этих свечей - макс.,миним.,откр., закрытие...

Зачем всё это? У моего ДЦ свечи одни и стратегия которую я отрабатываю советником на нем работает, но много ошибок рассогласования графиков. Это насколько я понял проблемы ДЦ и при анализе участниками форума не приветствуется!)

А вот скачав историю MetaQuotes ошибок нет, но свечи даже при визуальном тестировании дают мало сигналов и тест советника на них дает плохой результат.

Поэтому и задумался над этим вопросом - "сдвига" свечей по времени, чтоб совпадали с моим ДЦ или с каким-либо другим..

 

Как уменьшить ошибки своего ДЦ и повысить качество моделирования?



EUR/0.1-10 лот/1 год/300-322000

 

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

//+------------------------------------------------------------------+
//| Открытие позиции на покупку
//+------------------------------------------------------------------+
void OpenBuy() 
  { 
   RefreshRates();
      if ((OrdersTotal()==0) && (Ask == Enter)) //бъем до упора эту цену
         {
            if (IsTradeContextBusy()==false)
               {
                  OrderSend(Symbol(), OP_BUY, Lot, Enter, Slippage, 0, 0, 0, MAGIC,0, clOpenBuy);
                  if (OrdersTotal()>0)
                     {
                        Modify = false;                              //флаг установки SL и TP - не установлен
                        ModifySL();                        
                     }
                  else Print("Ошибка установки ордера BAY по цене ",OrderOpenPrice()," код ошибки ="+GetLastError());
               }  
         }              
      if (UseSound) PlaySound(NameFileSound);
  } 
//+------------------------------------------------------------------+
//| Открытие позиции на продажу
//+------------------------------------------------------------------+
void OpenSell() 
  { 
   RefreshRates();
      if ((OrdersTotal()==0)&&(Bid == Enter))  //бъем до упора эту цену
         { 
            if (IsTradeContextBusy()==false)
               {
                  OrderSend(Symbol(), OP_SELL, Lot, Enter, Slippage, 0, 0, 0, MAGIC,0, clOpenSell);
                  if (OrdersTotal()>0)
                     {
                        Modify = false;                              //флаг установки SL и TP - не установлен
                        ModifySL();
                     }   
                  else Print("Ошибка установки ордера SELL по цене ",OrderOpenPrice()," код ошибки ="+GetLastError());
               }
         }
      if (UseSound) PlaySound(NameFileSound);        
  } 
//+------------------------------------------------------------------+
//| Модификация ордера на установку SL и TP                                                                 |
//+------------------------------------------------------------------+
void ModifySL()
   {
      if (OrderSelect(0,SELECT_BY_POS)==true) // Если есть открытый ордер
         {       
            if (OrderType()==OP_BUY)
               {
                  StopL = SLB(); 
                  TakeP = TPB();
                  Modify = OrderModify(OrderTicket(),OrderOpenPrice(),StopL,TakeP,0,Red);
                  if (Modify == false) Print("Ошибка изменения ордера #",OrderTicket(), " при попытке установить СТОП ",StopL,". Текущая цена- ",Bid,", код ошибки ="+GetLastError());
               }
            else
               {
                  StopL = SLS(); 
                  TakeP = TPS();
                  Modify = OrderModify(OrderTicket(),OrderOpenPrice(),StopL,TakeP,0,Red);
                  if (Modify == false) Print("Ошибка изменения ордера #",OrderTicket(), " при попытке установить СТОП ",StopL,". Текущая цена- ",Ask,", код ошибки ="+GetLastError());
               }
         }     
   }

Потом в int Start () идет проверка на модификацию...

//+------------------------------------------------------------------+
//| Проверка открытого оредра на установку SL,TP и установка SL,TP
//+------------------------------------------------------------------+
    if ((OrdersTotal()>0) && (Modify == false)) ModifySL();  //SL и TP - не установлен
 

Спасибо кто помогал!)

Сейчас учусь запускать советник одновременно на разных инструментах...

Подскажите такой вариант подходит для нахождения ордера принадлежащего инструменту на котором запущен советник?

for (int i=1; i<=OrdersTotal(); i++)          //Цикл по всем ордерам,..
  {                                           //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий         
        {
          if(OrderSymbol()==Symbol())
            {
              if (OrderType()==OP_BUY)
               {
                 ... 
               }  
              else
               {
                 ...
               }

            }
        } 
  }                                         //Конец тела цикла
Причина обращения: