Вопросы по MQL5 и работе терминала MT5 от новичка.

 

Я нахожусь с самом начале изучения языка MQL5.До этого никакие языки не изучал.

Вопросы такие:1)Написал,вернее скопировал эксперта с внешней переменной " extern " ,а в настройках советника её нет. Почему ? фаил советника

                         2)Как изменить настройки графика в тестере стратегий при визуализации.Изображение графика возвращается 

                          к своим первоначальным настройкам, даже если применить шаблон.

                         Заранее спасибо за ответ.

 
NZT48:

***

Вопросы такие:1)Написал,вернее скопировал эксперта с внешней переменной " extern " ,а в настройках советника её нет. Почему ? 

***

Входные переменные необходимо объявлять как input, а не extern

NZT48:

***

Как изменить настройки графика в тестере стратегий при визуализации.Изображение графика возвращается к своим первоначальным настройкам, даже если применить шаблон.

***

Есть два варианта:

  1. настройте график и сохраните его под именем "tester.tpl" - данный шаблон будет применяться ко всем кодам запускаемым в тестере в визуальном режиме.
  2. настройте график и сохраните его под именем запускаемого эксперта - в таком случае шаблон будет применён в тестере в визуальном режиме только в данному советнику. 

 

Кто нибудь мог бы написать  очень простого советника с комментариями на русском для того,чтобы понять код программы? А то существующие сложны для понимания начинающими.

Есть много уроков по MQL4  и мало по MQL5.И когда начинаешь изучать примеры для MQL4 и переносить их на MQL5 то не всегда получается, видимо функции по иному работают.

Да и сложнее в MQL5.Например функция OrderSend в MQL4 гораздо проще , чем в MQL5.Начинающим же предлагают использовать классы. Например CTrade.

 
Вот статья https://www.mql5.com/ru/articles/100 по моему мнению самая доступная для понимания.
Пошаговое руководство по написанию MQL5-советников для начинающих
Пошаговое руководство по написанию MQL5-советников для начинающих
  • www.mql5.com
Эта статья предназначена для начинающих, для тех, кто хочет научиться написанию простых советников на новом языке MQL5. Сначала мы определимся с тем, что требуется от нашего советника, а затем приступим к написанию того, каким образом он будет это делать. 1. Торговая стратегия Он будет следить за некоторыми индикаторами и при определенном...
 
NZT48:

Кто нибудь мог бы написать  очень простого советника с комментариями на русском для того,чтобы понять код программы? А то существующие сложны для понимания начинающими.

Есть много уроков по MQL4  и мало по MQL5.И когда начинаешь изучать примеры для MQL4 и переносить их на MQL5 то не всегда получается, видимо функции по иному работают.

Да и сложнее в MQL5.Например функция OrderSend в MQL4 гораздо проще , чем в MQL5.Начинающим же предлагают использовать классы. Например CTrade.

прочитайте эта статью в конце пример скрипта и простой советник с использованием CTrade. Проще не куда эксперементируйте.

Нейросети бесплатно и сердито - соединяем NeuroPro и MetaTrader 5
Нейросети бесплатно и сердито - соединяем NeuroPro и MetaTrader 5
  • www.mql5.com
Программа NeuroPro создана в одном из российских институтов в 98-м году, но не теряет своей актуальности и по сей день. Она успешно работает и на Windows XP, и на Vista, и на 7-ке. Проверить ее работу на более новых Windows я пока не имел возможности. Версия 0.25 распространяется бесплатно, ее можно найти на многих сайтах в Интернете. NeuroPro...
 
Большое спасибо!!!
 
При создании нового советника из шаблона пропали # property. Как их вернуть , а то постоянно приходится копировать.
 
NZT48:
При создании нового советника из шаблона пропали # property. Как их вернуть , а то постоянно приходится копировать.
 
  1. Попытался переделать советника Moving Average , чтобы он открывал сделки на пересечении двух скользящих средних.Скомпилировал ,вроде ошибок нет,но 
  2. сделки почему то не открываются? Может кто подскажет?
    //+------------------------------------------------------------------+
    //|                                           Moving Average v.2.mq5 |
    //|                        Copyright 2018, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copirignt 2018,MetaQuostes Software  Group."
    #property link      "http://www.mql5.com"
    #property version    "1.0"
    #property strict
    
    #include <Trade\Trade.mqh>
    
    input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
    input double DecreaseFactor     = 3;       // Descrease factor
    input int    MovingPeriod1        = 12;      // Moving Average period
    input int    MovingPeriod2        = 21;      // Moving Average period
    
    input int    MovingShift        = 6;       // Moving Average shift
    //---
    int    ExtHandle=0;
    bool   ExtHedging=false;
    CTrade ExtTrade;
    
    #define MA_MAGIC 1234501
    //+------------------------------------------------------------------+
    //| Calculate optimal lot size(рассчитать оптимальный размер лота)                                       |
    //+------------------------------------------------------------------+
    double TradeSizeOptimized(void)
      {
       double price=0.0;
       double margin=0.0;
    //--- select lot size
       if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
          return(0.0);
       if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
          return(0.0);
       if(margin<=0.0)
          return(0.0);
    
       double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
    //--- calculate number of losses orders without a break( рассчитать кол-во убыточных ордеров без перерыва)
       if(DecreaseFactor>0)
         {
          //--- select history for access(выберите историю для доступа)
          HistorySelect(0,TimeCurrent());
          //---
          int    orders=HistoryDealsTotal();  // total history deals(общая история сделок)
          int    losses=0;                    // number of losses orders without a break(кол-во убыточных ордеров без перерыва)
    
          for(int i=orders-1;i>=0;i--)
            {
             ulong ticket=HistoryDealGetTicket(i);
             if(ticket==0)
               {
                Print("HistoryDealGetTicket failed, no trade history");
                break;
               }
             //--- check symbol
             if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
                continue;
             //--- check Expert Magic number
             if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
                continue;
             //--- check profit
             double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
             if(profit>0.0)
                break;
             if(profit<0.0)
                losses++;
            }
          //---
          if(losses>1)
             lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
         }
    //--- normalize and check limits(нормализация и проверка ограничений)
       double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
       lot=stepvol*NormalizeDouble(lot/stepvol,0);
    
       double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
       if(lot<minvol)
          lot=minvol;
    
       double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
       if(lot>maxvol)
          lot=maxvol;
    //--- return trading volume
       return(lot);
      }
    //+------------------------------------------------------------------+
    //| Check for open position conditions(проверка условий открытия позиции)                               |
    //+------------------------------------------------------------------+
    void CheckForOpen(void)
      {
       MqlRates rt[2];
    //--- go trading only for first ticks of new bar(торговать только на первые тики нового бара)
       if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
         {
          Print("CopyRates of ",_Symbol," failed, no history");
          return;
         }
       if(rt[1].tick_volume>1)
          return;
    //--- get current Moving Average 
       
      
       double   ma1[1];
       if(CopyBuffer(ExtHandle,0,0,1,ma1)!=1)
         {
          Print("CopyBuffer from iMA failed, no data");
          return;
         }
        double   ma2[1];
       if(CopyBuffer(ExtHandle,0,0,1,ma2)!=1)
         {
          Print("CopyBuffer from iMA failed, no data");
          return;
         } 
         
    //--- check signals(сигналы проверки)
       ENUM_ORDER_TYPE signal=WRONG_VALUE;
    
       if(ma1[0] <ma2[0])
          signal=ORDER_TYPE_SELL;    // sell conditions
       else
         {
          if(ma1[0]>ma2[0] )
             signal=ORDER_TYPE_BUY;  // buy conditions
         }
    //--- additional checking
       if(signal!=WRONG_VALUE)
         {
          if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
             ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                                   SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                                   0,0);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Check for close position conditions(проверка условий закрытия позиции)                              |
    //+------------------------------------------------------------------+
    void CheckForClose(void)
      {
       MqlRates rt[2];
    //--- go trading only for first ticks of new bar(торговать только на первые тики нового бара)
       if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
         {
          Print("CopyRates of ",_Symbol," failed, no history");
          return;
         }
       if(rt[1].tick_volume>1)
          return;
    //--- get current Moving Average(получить текущую скользящую среднюю) 
       double   ma1[1];
       
       if(CopyBuffer(ExtHandle,0,0,1,ma1)!=1)
         {
          Print("CopyBuffer from iMA failed, no data");
          return;
         }
         double   ma2[1];
       
       if(CopyBuffer(ExtHandle,0,0,1,ma1)!=1)
         {
          Print("CopyBuffer from iMA failed, no data");
          return;
         }
    //--- positions already selected before(позиции уже выбранные ранее)
       bool signal=false;
       long type=PositionGetInteger(POSITION_TYPE);
    
       if(type==(long)POSITION_TYPE_BUY  && ma1[0] > ma2[0])
          signal=true;
       if(type==(long)POSITION_TYPE_SELL  && ma1[0]< ma2[0])
          signal=true;
    //--- additional checking(дополнительная проверка)
       if(signal)
         {
          if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
             ExtTrade.PositionClose(_Symbol,3);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Position select depending on netting or hedging(выбор позиции в зависимости от неттинга или хеджирования)                 |
    //+------------------------------------------------------------------+
    bool SelectPosition()
      {
       bool res=false;
    //--- check position in Hedging mode(проверка позиции в режиме хеджирования )
       if(ExtHedging)
         {
          uint total=PositionsTotal();
          for(uint i=0; i<total; i++)
            {
             string position_symbol=PositionGetSymbol(i);
             if(_Symbol==position_symbol && MA_MAGIC==PositionGetInteger(POSITION_MAGIC))
               {
                res=true;
                break;
               }
            }
         }
    //--- check position in Netting mode(проверка позиции в режиме неттинга )
       else
         {
          if(!PositionSelect(_Symbol))
             return(false);
          else
             return(PositionGetInteger(POSITION_MAGIC)==MA_MAGIC); //---check Magic number
         }
    //--- result for Hedging mode
       return(res);
      }
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit(void)
      {
    //--- prepare trade class to control positions if hedging mode is active(подготовить торговый класс к управлению позициями)
       ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
       ExtTrade.SetExpertMagicNumber(MA_MAGIC);
       ExtTrade.SetMarginMode();
       ExtTrade.SetTypeFillingBySymbol(Symbol());
    //--- Moving Average indicator
       ExtHandle=iMA(_Symbol,_Period,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE);
       ExtHandle=iMA(_Symbol,_Period,MovingPeriod2,MovingShift,MODE_SMA,PRICE_CLOSE);
       if(ExtHandle==INVALID_HANDLE)
         {
          printf("Error creating MA indicator");
          return(INIT_FAILED);
         }
    //--- ok
       return(INIT_SUCCEEDED);
      }
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick(void)
      {
    //---
       if(SelectPosition())
          CheckForClose();
       else
          CheckForOpen();
    //---
      }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
      }
    //+------------------------------------------------------------------+
    

 

Вопрос: как выйти с аккаунта?

Залогинился в терминале на чужом компе, но нет кнопки разлогина.

 
Vitaly Muzichenko:

Вопрос: как выйти с аккаунта?

Залогинился в терминале на чужом компе, но нет кнопки разлогина.

Просто удалить и все, нет?
Причина обращения: