Ошибки, баги, вопросы - страница 809

 

Доброго дня! Я заранее прошу прощения, может я что-то туплю, или не понимаю какие-то очивидные вещи. Я пытаюсь использовать индикатор iMA, стараюсь писать согласно примерам, что я читал. 

В общем, пытаюсь так. ВВерху, выше всех функций советника, обьявляю

double      MA[];                // массив для индикатора iMA
//---- handles for indicators
int         MA_handle;           // указатель на индикатор iMA

Затем использую функцию, каторая будет работать внутри функции OnTick(). В образце, сама функция в нижней части. Собствено, из всего масива я пока

 if (EURNZD_d1 != 0.0) countq++;
      EURUSD_d1 = CalculateStrengthPairsTF("EURUSD"+dop_symb, PERIOD_D1);
      if (EURUSD_d1 != 0.0) countq++;
      EURCAD_d1 = CalculateStrengthPairsTF("EURCAD"+dop_symb, PERIOD_D1);
      if (EURCAD_d1 != 0.0) countq++;
      EURGBP_d1 = CalculateStrengthPairsTF("EURGBP"+dop_symb, PERIOD_D1);
      if (EURGBP_d1 != 0.0) countq++;
      EURAUD_d1 = CalculateStrengthPairsTF("EURAUD"+dop_symb, PERIOD_D1);
      if (EURAUD_d1 != 0.0) countq++;
      EURCHF_d1 = CalculateStrengthPairsTF("EURCHF"+dop_symb, PERIOD_D1);
      if (EURCHF_d1 != 0.0) countq++;
      if (countq != 0) D1_eur = NormalizeDouble((EURJPY_d1 + EURNZD_d1 + EURUSD_d1 + EURCAD_d1 + EURGBP_d1 + EURAUD_d1 + EURCHF_d1) / countq, 0);
   }
   int l_count_4 = 0;
   AVG_eur = 0;
   if (M1_eur != 0.0) l_count_4++;
   if (M5_eur != 0.0) l_count_4++;
   if (M15_eur != 0.0) l_count_4++;
   if (M30_eur != 0.0) l_count_4++;
   if (H1_eur != 0.0) l_count_4++;
   if (H4_eur != 0.0) l_count_4++;
   if (D1_eur != 0.0) l_count_4++;
   if (l_count_4 != 0) AVG_eur = (M1_eur + M5_eur + M15_eur + M30_eur + H1_eur + H4_eur + D1_eur) / l_count_4;
}

double CalculateStrengthPairsTF(string a_symbol, int a_timeframe) {
    int DIGITS_ = SymbolInfoInteger(a_symbol,SYMBOL_DIGITS);
   //---
    MqlTick last_tick;
   if(SymbolInfoTick(a_symbol,last_tick));
   double BID_ = last_tick.bid;
   BID_ = NormalizeDouble( BID_, DIGITS_);
    MA_handle=iMA(a_symbol,a_timeframe,Period_,0,method_ma,price_applied);
    //--- заполнение массива MA[] текущими значениями индикатора iMA
   //--- в массив будет записано 100 элементов
   CopyBuffer(MA_handle,0,0,100,MA);
   //--- задаём порядок индексации массива MA[] как в MQL4
   ArraySetAsSeries(MA,true);  
   double iMA_ = NormalizeDouble(MA[0], DIGITS_);

буду использовать только последнее-нулевое-значение.

 

Пишет ошибку    'a_timeframe' - can't convert enum Сова.mq5 2009 28

 

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

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Dimka-novitsek:

Пишет ошибку    'a_timeframe' - can't convert enum Сова.mq5 2009 28

Обявите её с типом ENUM_TIMEFRAMES
 

Спасибо!! А это то же самое, что double, стринг или инт?   Что-то не вьеду, простите уж, куда этот тип вписать?

 

Хорошо, спасибо! 

 
Valmars:
Это  чисто баг тестера. Поле trans.price_tp в случае TRADE_TRANSACTION_DEAL_ADD может содержать 0 или любой мусор. В on-line торговле выводится всё правильно.
Спасибо. Исправлено. Исправление будет доступно в ближайшем билде.
 
//+------------------------------------------------------------------+
//|                                                       cs2011.mq5 |
//|                                         Copyright © 2011, Xupypr |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Xupypr"
#property version   "1.1"
//+-----------------------------------+
input double Risk=3; // Стартовый лот
input int TP=2200;
input int SL=0;
input int Fast=30;
input int Slow=500;
input int Sign=36;
//+-----------------------------------+
double Money,Deposit=5000;
int    MACD;
//+-----------------------------------+
void OnInit()
  {
   MACD=iMACD(NULL,0,Fast,Slow,Sign,PRICE_CLOSE);
  }
//+-----------------------------------+
void OnTick()
  {
   static bool UpSignal,DnSignal;
   if(TradeSignalCounter(UpSignal,DnSignal)) TradePerformer(UpSignal,DnSignal);
  }
//+-----------------------------------+
bool TradeSignalCounter(bool &UpSignal,bool &DnSignal)
  {
   if(Bars(_Symbol,0)<100) return(false);
   static int Recount;
   if(IsNewBar() || Recount)
     {
      double Ind[2],Sig[3];
      DnSignal=false;
      UpSignal=false;
      Recount=false;
      if(CopyBuffer(MACD,0,1,2,Ind)<0) Recount=true;
      if(CopyBuffer(MACD,1,1,3,Sig)<0) Recount=true;
      if(Recount==true) return(false);
      if(Ind[0]>0 && Ind[1]<0) DnSignal=true;
      if(Ind[0]<0 && Ind[1]>0) UpSignal=true;
      if(Ind[1]<0 && Sig[0]<Sig[1] && Sig[1]>Sig[2]) DnSignal=true;
      if(Ind[1]>0 && Sig[0]>Sig[1] && Sig[1]<Sig[2]) UpSignal=true;
      return(true);
     }
   return(false);
  }
//+-----------------------------------+
bool TradePerformer(bool &UpSignal,bool &DnSignal)
  {
   if(UpSignal)
     {
      if(PositionOpen(POSITION_TYPE_BUY)) UpSignal=false;
     }
   if(DnSignal)
     {
      if(PositionOpen(POSITION_TYPE_SELL)) DnSignal=false;
     }
   return(true);
  }
//+-----------------------------------+
double Money_M()
  {
   HistorySelect(0,TimeCurrent());
   int total=HistoryDealsTotal();
   double profit=0;
   for(int i=0;i<total;i++)
     {
      ulong deal_ticket=HistoryDealGetTicket(i);
      if(HistoryDealGetString(deal_ticket,DEAL_SYMBOL)!=_Symbol) continue;
      if(HistoryDealGetInteger(deal_ticket,DEAL_TYPE)>1) continue;
      profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
      profit+=HistoryDealGetDouble(deal_ticket,DEAL_SWAP);
     }
   Money=Deposit+profit;
   if(PositionSelect(_Symbol))
     {
      Money+=PositionGetDouble(POSITION_PROFIT);
      Money+=PositionGetDouble(POSITION_SWAP);
     }
   double Min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double Limit=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_LIMIT);
   double Lots=Risk*Money/Deposit;
   Lots=MathMin(Limit,MathMax(Min,Lots));
   return(Lots);
  }
//+-----------------------------------+
bool PositionOpen(ENUM_POSITION_TYPE Type)
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   double volume=Money_M();
   double takeprofit=0,stoploss=0;
   if(PositionSelect(_Symbol))
     {
      double volumepos=PositionGetDouble(POSITION_VOLUME);
      if(PositionGetInteger(POSITION_TYPE)==Type) volume-=volumepos;
      else volume+=volumepos;
     }
   for(int i=0;i<10;i++)
     {
      volume=NormalizeDouble(volume,1);
      if(volume<=0) break;
      if(Type==POSITION_TYPE_SELL)
        {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
         if(TP!=0) takeprofit = request.price-TP*_Point;
         if(SL!=0) stoploss = request.price+SL*_Point;
        }
      if(Type==POSITION_TYPE_BUY)
        {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         if(TP!=0) takeprofit = request.price+TP*_Point;
         if(SL!=0) stoploss = request.price-SL*_Point;
        }
      request.action = TRADE_ACTION_DEAL;
      request.symbol = _Symbol;
      request.volume = MathMin(volume,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX));
      request.sl = stoploss;
      request.tp = takeprofit;
      request.deviation=SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
      request.type_filling=ORDER_FILLING_AON;    
      request.comment=DoubleToString(Money,2)+"$";
      if(!OrderCheck(request,check))
        {
         if(check.margin_level<100) volume-=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
        }
      if(!OrderSend(request,result) || result.deal==0)
        {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
        }
      else volume-=result.volume;
      Sleep(1000);
     }
   if(!PositionSelect(_Symbol)) return(false);
   return(true);
  }
//+-----------------------------------+
bool IsNewBar()
  {
   static datetime Told;
   datetime Tnew[1];
   CopyTime(_Symbol,PERIOD_CURRENT,0,1,Tnew);
   if(Tnew[0]!=Told)
     {
      Told=Tnew[0];
      return(true);
     }
   return(false);
  }
//+-----------------------------------+

 Подскажите почему в советнике в строке  request.type_filling=ORDER_FILLING_AON;   пишется  ошибка 'ORDER_FILLING_AON' - undeclared identifier  cs2011.mq5 127 28  в версии  697 


 

 

 


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результатов проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результатов проверки торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура результатов проверки торгового запроса - Документация по MQL5
 
FRX154:

 Подскажите почему в советнике в строке  request.type_filling=ORDER_FILLING_AON;   пишется  ошибка 'ORDER_FILLING_AON' - undeclared identifier  cs2011.mq5 127 28  в версии  697

Потому что с тех пор как был написан советник произошли изменения в языке.

поставьте в этой строке вместо request.type_filling=ORDER_FILLING_AON;

request.type_filling=ORDER_FILLING_FOK; и будет вам счастье.

Хотя можете просто 0 поставить

request.type_filling=0;

тоже покатит.

PS или как вариант можно (чтоб не делать правки во всём советнике) поставить заплатку на самом верху до всего

#define ORDER_FILLING_AON ORDER_FILLING_FOK

это на случай если ORDER_FILLING_AON упоминается несколько раз, и чтоб не отлавливать все можно так сделать.

 
Почему-то наблюдаю такую картину: набрасываю индюк в терминале из Навигатора на чарт, а на чарте появляется пустая область под индюк, сам индюк не отображается, а если открыть список индюков чарта, то там он значится с припиской "Debugging". Что за баг и как бороться?
 
marketeer:
Почему-то наблюдаю такую картину: набрасываю индюк в терминале из Навигатора на чарт, а на чарте появляется пустая область под индюк, сам индюк не отображается, а если открыть список индюков чарта, то там он значится с припиской "Debugging". Что за баг и как бороться?
Перекомпилировать
 

Люди добрые, помогите!

Берем простейший код.

#property copyright "Copyright 2011,"
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
double Vhod;
       Vhod=linfunc(15);

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
     }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
     }
//+------------------------------------------------------------------+
double  linfunc(int b) // имя функции и список параметров
  {
  double a;
   while((a/b)<1 && !IsStopped())//---------
     {
      a=a+1;
     }
     double f=a+b;
// составной оператор
   return(a+b);           // возвращаемое значение

  }

Компилируем на 687 билде, и получаем в отладчике Vhod=0 

Как это понимать??? При этом иногда у меня получалось Vhod=30. (странно но факт) 

return какую то ерунду возвращает...

Чего за глюки или я чего-то недопонимаю???

 

У меня предложение к разработчикам -- сделайте значения по умолчанию у всех встроенных типов. С++ в этом смысле не эталон для подражания.

Ну ведь реально кучу времени и нервов сэкономите себе и отвечающим, на отсутствии вопросов как сверху.