Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 493

 
Nikita Solodko:

День добрый.

Подскажите как решить проблему. При попытке отправки файла функцией SendFTP() возникает ошибка 4014 - Системная функция не разрешена для вызова.

С настройками FTP все в порядке - отчеты и тестовый файл отправляются.

Заранее благодарен. 

Вы случайно не из индикатора пытаетесь отправлять?
 
Karputov Vladimir:
Вы случайно не из индикатора пытаетесь отправлять?
Случайно да... А что нельзя?
 
Nikita Solodko:
Случайно да... А что нельзя?
Нельзя из-за того, что в случае сетевых задержек по ftp индикатор может затормозить весь терминал. А вот из советника - пожалуйста.
 
Karputov Vladimir:
Нельзя из-за того, что в случае сетевых задержек по ftp индикатор может затормозить весь терминал. А вот из советника - пожалуйста.
Спасибо.
 

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

void OnTick()
{
 datetime EaStartTime = StringToTime(StartTime);  // время начала работы советника
 datetime EaEndTime = StringToTime(EndTime);      // время окончания работы советника
 datetime CurrTime = TimeCurrent();               // это если нужно взять время терминала
 if (CurrTime < EaStartTime || CurrTime >= EaEndTime)
  return;                                         // если еще не время торговать - выход
{
 PriceLow=iEnvelopes(NULL,0,MA_Period,MA_Shift,MA_Method,Applied_Price,Deviation,0,1);
 PriceHigh =iEnvelopes(NULL,0,MA_Period,MA_Shift,MA_Method,Applied_Price,Deviation,1,1);
 MacdCurrent=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,0);
 SignalCurrent=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_SIGNAL,0);
 SignalMAPrevious=iMA(NULL,0,InpMAPeriod,InpMAShift,InpMAMethod,PRICE_MEDIAN,1);
 SignalMAThis=iMA(NULL,0,InpMAPeriod,InpMAShift,InpMAMethod,PRICE_MEDIAN,0);
 PriceCurrentOpen=iOpen(NULL,0,1);
 PriceCurrentClose=iClose(NULL,0,1);
  if (CountTrades()==0) CheckForOpen();
   else
  {
   if(CountTrades()<max_trades) CheckForOpen();
  }
 }
}  
void CheckForOpen()
{
//-----Ставим ордер на покупку.
 if(PriceCurrentOpen<PriceLow&&PriceCurrentOpen<PriceCurrentClose&&SignalCurrent<MacdCurrent&&SignalMAPrevious<SignalMAThis)
 {
  ticket=OrderSend(NULL,OP_BUY,Lots,Ask,slippage,0,0,"5",magic,0,Blue);
   if(ticket>0)
    return; 
 }
//-----Ставим ордер на продажу.
 if(PriceCurrentOpen>PriceLow&&PriceCurrentOpen>PriceCurrentClose&&SignalCurrent>MacdCurrent&&SignalMAPrevious>SignalMAThis)
 {
  ticket=OrderSend(NULL,OP_SELL,Lots,Bid,slippage,0,0,"5",magic,0,Red);
   if(ticket>0)
    return; 
 }
}

 Сигнал на покупку-продажу должен подаваться,если предыдущий бар открывался вне канала "Envelopes",если выше канала,то продажа,если ниже-покупка.По факту ордера ставятся,когда советнику захочется.Может долго гулять внутри канала и вдруг начать покупать ордера,хотя все остальные условия соблюдаются,если сигнал на продажу-продает,на покупку-покупает.Как это исправить?

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

 
Nickolay72:

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

 Сигнал на покупку-продажу должен подаваться,если предыдущий бар открывался вне канала "Envelopes",если выше канала,то продажа,если ниже-покупка.По факту ордера ставятся,когда советнику захочется.Может долго гулять внутри канала и вдруг начать покупать ордера,хотя все остальные условия соблюдаются,если сигнал на продажу-продает,на покупку-покупает.Как это исправить?

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

Доброго времени суток. Перед отправкой приказа проверяйте наличие уже открытых позиций, если таковые имеются не отправлять приказ на открытие иначе отправлять. Насколько я понял ваш код этим у вас занимается функция  CountTrades(), но кода ее вы не показываете. Так что проверяйте значения возвращаемые этой функцией.
 
 Количесто ордеров в принципе цель второстепенная,до вчера у меня открывалось по одному ордеру,и пока ордер есть,следующий не открывался.А как заставить советника открывать ордера согласно приказу-когда предыдущий бар открылся выше(ниже) канала?Сейчас большинство ордеров убыточные,потому что открываются не по условиям.
Файлы:
Zmey.mq4  5 kb
 
Nickolay72:
 Количесто ордеров в принципе цель второстепенная,до вчера у меня открывалось по одному ордеру,и пока ордер есть,следующий не открывался.А как заставить советника открывать ордера согласно приказу-когда предыдущий бар открылся выше(ниже) канала?Сейчас большинство ордеров убыточные,потому что открываются не по условиям.
Если Open бара номер 1 выше/ниже канала.
 
Nickolay72:
 Количесто ордеров в принципе цель второстепенная,до вчера у меня открывалось по одному ордеру,и пока ордер есть,следующий не открывался.А как заставить советника открывать ордера согласно приказу-когда предыдущий бар открылся выше(ниже) канала?Сейчас большинство ордеров убыточные,потому что открываются не по условиям.
 if (CountTrades()==0) CheckForOpen();
   else
  {
   if(CountTrades()<max_trades) CheckForOpen();
  }

Если анализировать вот этот кусок кода, то согласно ему у вас в случае если функция CountTrades() возвращает ноль то выполняется условие if (CountTrades()==0) CheckForOpen(); и вызывается функция CheckForOpen(). На следующем тике если ордер был открыть функция CountTrades() по идее вернет значение 1 и тогда уже будет выполнятся условие else 

....  
else
  {
   if(CountTrades()<max_trades) CheckForOpen();
  }

  Если окажется что CountTrades()<max_trades то будет еще раз выполнена функция CheckForOpen(). Судя по коду значение переменной  max_trades равно 3. Таким образом у вас будет открыто 4-ре ордера.

Если советник открывает ордера не правильно, то проверяйте логику где вы указываете условия при которых должны открываться позиции в функции CheckForOpen() .  И еще проверьте условия времени работы советника if (CurrTime < EaStartTime || CurrTime >= EaEndTime). Я бы на вашем месте использовал функцию  if (TimeHour(TimeCurrent()) = час начала работы && TimeMinute(TimeCurrent()) = минуты начала работы ). Час и минуты начала работы задаются в переменных типа int или uint.

 
Artyom Trishkin:
Если Open бара номер 1 выше/ниже канала.
Чьерт побьери,только что увидел,что у меня торговля вокруг нижней границы канала завязана.Просто скопировал приказы,а низ на верх не исправил.Сейчас попробую исправленный вариант.Спасибо)
//-----Ставим ордер на покупку.
 if(PriceCurrentOpen<PriceLow&&PriceCurrentOpen<PriceCurrentClose&&SignalCurrent<MacdCurrent&&SignalMAPrevious<SignalMAThis)
 {
  ticket=OrderSend(NULL,OP_BUY,Lots,Ask,slippage,0,0,"5",magic,0,Blue);
   if(ticket>0)
    return; 
 }
//-----Ставим ордер на продажу.
 if(PriceCurrentOpen>PriceLow&&PriceCurrentOpen>PriceCurrentClose&&SignalCurrent>MacdCurrent&&SignalMAPrevious>SignalMAThis)
 {
  ticket=OrderSend(NULL,OP_SELL,Lots,Bid,slippage,0,0,"5",magic,0,Red);
   if(ticket>0)
    return;