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

 
shtr:

Всем привет!

Подскажите, пожалуйста, почему не открываются ордера?

Иниту - инитово, торговле - тоговое. Есть ОнТик для советников, нечего в инит всё подряд пихать...

И для инита есть специально придуманные разработчиками коды завершения работы, почему не пользуемся?

 
evillive:

Иниту - инитово, торговле - тоговое. Есть ОнТик для советников, нечего в инит всё подряд пихать...

И для инита есть специально придуманные разработчиками коды завершения работы, почему не пользуемся?

Не пользуемся, должно быть, потому, что не знаем про коды завершения работы инита. Примеры в учебнике отличаются от формы в редакторе. Функция int start(), например, там отсутствует. Когда я запихал в инит пример простого советника из учебника, то он, почему-то, работал. А что бы не писал я - ничего не получалось. Вот я и решил, спустя две недели опытов, обратиться к специалистам. Спасибо за совет! 

Закинул все это в ОнТик, но ничего не изменилось. 

 
shtr:

Не пользуемся, должно быть, потому, что не знаем про коды завершения работы инита. Примеры в учебнике отличаются от формы в редакторе. Функция int start(), например, там отсутствует. Когда я запихал в инит пример простого советника из учебника, то он, почему-то, работал. А что бы не писал я - ничего не получалось. Вот я и решил, спустя две недели опытов, обратиться к специалистам. Спасибо за совет! 

Закинул все это в ОнТик, но ничего не изменилось. 

Забудьте учебник, он по старому синтаксису написан, с тех пор многое изменилось. Справка из поставки терминала - наиболее актуальна, да и кодобаза, если поискать, тоже источник примеров на новой версии MQL.

А насчёт не писать весь код в ините, так это было и раньше, поискать по форуму, так сотни постов наберётся на всех языках этого форума, просто каждый раз находится новый писатель, который не читатель ;)

 
evillive:

Забудьте учебник, он по старому синтаксису написан, с тех пор многое изменилось. Справка из поставки терминала - наиболее актуальна, да и кодобаза, если поискать, тоже источник примеров на новой версии MQL.

А насчёт не писать весь код в ините, так это было и раньше, поискать по форуму, так сотни постов наберётся на всех языках этого форума, просто каждый раз находится новый писатель, который не читатель ;)

Спасибо!

Старые учебники, при потере актуальности, нужно сразу же скуривать)) 

 
shtr:

Спасибо!

Старые учебники, при потере актуальности, нужно сразу же скуривать)) 

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

Насчёт самого кода, есть вопросы по циклу, странный он какой-то, по-моему там фигурных скобок не хватает...

Да, и ещё расчёт уровней профита и убытка, неправильно они прописаны. Серверу надо передавать цену, желательно нормализованную, а не значение в пипсах.

 
evillive:

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

Насчёт самого кода, есть вопросы по циклу, странный он какой-то, по-моему там фигурных скобок не хватает...

Да, и ещё расчёт уровней профита и убытка, неправильно они прописаны. Серверу надо передавать цену, желательно нормализованную, а не значение в пипсах.

Все понял, спс. Скобки проверю - ошибок редактор не выдавал.

Почему же пример из книги работал..? Я сносил все функции и вставлял только код примера, начиная с инт старт. Ошибок не было, сделки открывались. 

 
shtr:

Все понял, спс. Скобки проверю - ошибок редактор не выдавал.

Почему же пример из книги работал..? Я сносил все функции и вставлял только код примера, начиная с инт старт. Ошибок не было, сделки открывались.

Ну так то, что работало не надо было торгать )))

А инт старт по-старому и есть ОнТик по-новому для советников, вот и надо было перенести всё из старт в ОнТик.  Вернее в вашем случае, из ОнИнит в ОнТик.

Компилятор отслеживает ошибки синтаксиса, логику не проверит никто, кроме человека. В особых случаях даже автор кода может запутаться :)

 
evillive:

Ну так то, что работало не надо было торгать )))

А инт старт по-старому и есть ОнТик по-новому для советников, вот и надо было перенести всё из старт в ОнТик.  Вернее в вашем случае, из ОнИнит в ОнТик.

Компилятор отслеживает ошибки синтаксиса, логику не проверит никто, кроме человека. В особых случаях даже автор кода может запутаться :)

 

//+------------------------------------------------------------------+
//|                                                         3333.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;
string Symb;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
   double MA_1_t;
   double MA_2_t; 
   double MA_3_t;
   int Total;
   int pos;
   
   Symb=Symbol();                               
   Total=0;                                   
   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES);
   if(pos==0)
   MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
   MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
   MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
   
   if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
     {
     double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
     double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
     pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
     return;
     }
    
   if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
     {
     double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
     double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
     pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit,"My order",16384,0,clrRed);
     return;
     }
   return;    
  
  }
//---
   
  

//+------------------------------------------------------------------+

 "Ну так то, что работало не надо было торгать )))"  Ну, дык, жыш, хочется самому что-нибудь накорябать )))

Пациент не пришел в себя после манипуляций 

 
shtr:

 "Ну так то, что работало не надо было торгать )))"  Ну, дык, жыш, хочется самому что-нибудь накорябать )))

Пациент не пришел в себя после манипуляций 

Ну так логика и математика хромает, понятно, что не будет так работать.

Вот, например, зачем в этом советнике цикл? То есть зачем, понятно, нужно посчитать, сколько ордеров по данному символу и магику уже есть, так? Но что мы видим тут, цикл-то ничего е считает, да и посчитать не может, так как "счётчик" ему не вкрутили )))

 

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

 OrderSelect() возвращает булево значение, истина или ложь, что никак не подходит для переменной pos. Да и цикл лучше считать от самого старого ордера, то есть в обратном порядке, чтобы не пропускать ордера.

Тут явно пригодилась бы переменная Total в качестве счётчика:

 

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

 Убрал лишнее, добавил вывод ошибки после OrderSend, для тестера на не-ECN счетах уже ордера открывает:

 

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

 А, да, ещё расчёт уровня СЛ для продаж был неправильный, внимательней нужно быть.

 
evillive:

Ну так логика и математика хромает, понятно, что не будет так работать.

Вот, например, зачем в этом советнике цикл? То есть зачем, понятно, нужно посчитать, сколько ордеров по данному символу и магику уже есть, так? Но что мы видим тут, цикл-то ничего е считает, да и посчитать не может, так как "счётчик" ему не вкрутили )))

 

 OrderSelect() возвращает булево значение, истина или ложь, что никак не подходит для переменной pos. Да и цикл лучше считать от самого старого ордера, то есть в обратном порядке, чтобы не пропускать ордера.

Тут явно пригодилась бы переменная Total в качестве счётчика:

 

 Убрал лишнее, добавил вывод ошибки после OrderSend, для тестера на не-ECN счетах уже ордера открывает:

 

 А, да, ещё расчёт уровня СЛ для продаж был неправильный, внимательней нужно быть.

Ого!!! Спасибо! Это требует осмысления. 

Может где-нибудь есть "самоучитель" по новым правилам?  4-х значный номер страницы немного напрягает...