Советники: Command Line Utility

 

Command Line Utility:

Утилита команд от Цветных линий

Command Line Utility

Автор: SanAlex

 

Не прошёл проверку 

System
Тестирование кода завершено с ошибками:
При тестировании кода Command Line Utility были выявлены ошибки.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

разница с опубликованным - в функциях  открытии и закрытии 
Command Line Utility.mq5
  102 kb

Файлы:
 
SanAlex:

3 часть 
Command Line Utility.mq5
  102 kb

Саша, у кого вы учились такому программированию?
 
Alexey Viktorov:
Саша, у кого вы учились такому программированию?

это я пытался из этого эксперта взять функции  Скачать бесплатно эксперт 'SerialMA_EA' от 'Scriptor' для MetaTrader 5 в MQL5 Code Base, 2018.02.27 

\\\\\\\\\\\\\\\\\\\\\\\\

то есть я их от туда и взял 

SerialMA_EA
SerialMA_EA
  • www.mql5.com
Советник на основе динамической скользящей средней.
 
Alexey Viktorov:
Саша, у кого вы учились такому программированию?

С Вашим экспертом тоже всё пытаюсь разобраться - что не будь придумать.

//+------------------------------------------------------------------+
//|                                                        00001.mq5 |
//+------------------------------------------------------------------+
//|                                                   DVA_Martin.mq5 |
//|                                          © 2021, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+

#property copyright "© 2021, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "3.00"
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
double            m_adjusted_point;      // : point value adjusted for 3 or 5 points
CTrade            m_trade;               // : trading object
CSymbolInfo       m_symbol;              // : symbol info object
CPositionInfo     m_position;            // : trade position object
CAccountInfo      m_account;             // : account info wrapper
//---
input int     Step                = 200;    // step of the first position
input int     Delta               = 100;    // addition to the step
// from the second position, it increases the distance of subsequent positions by the amount of "delta" from the previous one
input double  Lot                 = 0.2;    // the first opening lot
input double  MaximalLot          = 2.0;    // the maximum lot that we allow
input int     MaxTrades           = 9;      // maximum number of positions in one direction
input double  MultiplicatorLot    = 1.6;    // multiply the following positions
input int     Magic               = 123;    // the adviser's ID
//--- Variables for storing the collected information
bool ProcessBuy=false;
bool ProcessSell=false;
double MaxLot = 0,LotBuy = 0,LotSell = 0;
string   m_name_but[]= {"BUY","SELL"};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double contractSize(double volume, string symbol = NULL)
  {
   symbol = symbol == NULL ? _Symbol : symbol;
   double v = volume;
   double volumeStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   v = round(volume/volumeStep)*volumeStep;
   double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   return((v < minLot ? minLot : v));
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- initialize common information
   if(!m_symbol.Name(Symbol()))
      return(false);
   RefreshRates();
   m_trade.SetExpertMagicNumber(Magic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
   MaxLot = contractSize(MaximalLot);
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints(3*digits_adjust);
//---
   int but_y=5;
   for(int i=0; i<ArraySize(m_name_but); i++)
     {
      ButtonCreate(m_name_but[i],but_y,17,30,15,8);
      but_y=but_y+30;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   for(int i=0; i<ArraySize(m_name_but); i++)
     {
      ObjectDelete(0,Symbol()+m_name_but[i]);
     }
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CheckButon();
//---
   if(ProcessingBuy(ProcessBuy)||ProcessingSell(ProcessSell))
      return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
bool ProcessingBuy(const bool to_correct)
  {
   if(!m_symbol.Name(Symbol()))
      return(false);
   RefreshRates();
   int posTotal = PositionsTotal();
   double BuyMinPrice = DBL_MAX;
   double BuyMinLot = 0;
   double posPrice = 0.0,posLot = 0.0;
//---
   int b = 0;
   for(int i = 0; i < posTotal; i++)
     {
      ulong posTicket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic)
        {
         posPrice = PositionGetDouble(POSITION_PRICE_OPEN);
         posLot = PositionGetDouble(POSITION_VOLUME);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {
            b++; // We consider open positions for purchase
            if(posPrice < BuyMinPrice)
              {
               BuyMinPrice = posPrice;
               BuyMinLot = posLot;
              }
           }
        }
     }
//---
   LotBuy = b == 0 ? contractSize(Lot) : fmin(MaxLot, contractSize(BuyMinLot*MultiplicatorLot));
//--- BUY Signal
   if(to_correct && (b == 0 || (b < MaxTrades && BuyMinPrice-m_symbol.Ask() >= (Step+Delta*b)*_Point)))
      openPos(ORDER_TYPE_BUY,LotBuy,m_symbol.Ask());
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
bool ProcessingSell(const bool to_correct)
  {
   if(!m_symbol.Name(Symbol()))
      return(false);
   RefreshRates();
   int posTotal = PositionsTotal();
   double SelMaxPrice = DBL_MIN;
   double SelMaxLot = 0;
   double posPrice = 0.0,posLot = 0.0;
//---
   int s = 0;
   for(int i = 0; i < posTotal; i++)
     {
      ulong posTicket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic)
        {
         posPrice = PositionGetDouble(POSITION_PRICE_OPEN);
         posLot = PositionGetDouble(POSITION_VOLUME);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            s++; // We consider open positions for sale
            if(posPrice > SelMaxPrice)
              {
               SelMaxPrice = posPrice;
               SelMaxLot = posLot;
              }
           }
        }
     }
//---
   LotSell = s == 0 ? contractSize(Lot) : fmin(MaxLot, contractSize(SelMaxLot*MultiplicatorLot));
//--- SELL Signal
   if(to_correct && (s == 0 || (s < MaxTrades && m_symbol.Bid()-SelMaxPrice >= (Step+Delta*s)*_Point)))
      openPos(ORDER_TYPE_SELL,LotSell,m_symbol.Bid());
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void openPos(ENUM_ORDER_TYPE type, double lot, double price)
  {
   m_trade.CheckVolume(_Symbol, lot, price, type);
   if(m_trade.CheckResultMarginFree() <= 0.0)
     {
      Print("Not enough money for ", EnumToString(type), " ", lot, " ", _Symbol, " Error code=", m_trade.CheckResultRetcode());
      return;
     }
   if(!m_trade.PositionOpen(_Symbol, type, lot, price, 0.0, 0.0))
      Print(m_trade.ResultRetcode());
   PlaySound("ok.wav");
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//    buttoncreate                                                   |
//+------------------------------------------------------------------+
bool ButtonCreate(string name,int Xdist,
                  int Ydist,int Xsize,int Ysize,int FONTSIZE=12)
  {
   if(ObjectFind(0,Symbol()+name)<0)
      ObjectCreate(0,Symbol()+name,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_COLOR,clrWhite);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_BGCOLOR,clrDimGray);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_XDISTANCE,Xdist);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_YDISTANCE,Ydist);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_XSIZE,Xsize);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_YSIZE,Ysize);
   ObjectSetString(0,Symbol()+name,OBJPROP_FONT,"Sans Serif");
   ObjectSetString(0,Symbol()+name,OBJPROP_TEXT,name);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_FONTSIZE,FONTSIZE);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_SELECTABLE,false);
   return(true);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CheckButon(void)
  {
//---
   bool res=false;
   if(ObjectGetInteger(0,Symbol()+"BUY",OBJPROP_STATE)!=0)
     {
      ObjectSetInteger(0,Symbol()+"BUY",OBJPROP_STATE,0);
      ProcessBuy=true;
     }
   if(ObjectGetInteger(0,Symbol()+"SELL",OBJPROP_STATE)!=0)
     {
      ObjectSetInteger(0,Symbol()+"SELL",OBJPROP_STATE,0);
      ProcessSell=true;
     }
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

нравится мне как он умножает лот

Alexey Viktorov

 
SanAlex:

С Вашим экспертом тоже всё пытаюсь разобраться - что не будь придумать.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

нравится мне как он умножает лот


Только убери пожалуйста все упоминания обо мне из этого кода.Ведь могут подумать, что я так на *****кодил…
 
Alexey Viktorov:
Только убери пожалуйста все упоминания обо мне из этого кода.Ведь могут подумать, что я так на *****кодил…

Хорошо! - Вам Спасибо!  - я всё пытаюсь на учится, но наверное мне не дано правильно научится. 

 

Скажи мне пожалуйста, для чего в коде такая функция

//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      return(false);
     }
   return(true);
  }

Зачем тройная проверка?

Разве SymbolInfoTick не достаточно? Или оплата идёт от количества строк кода?

 
Alexey Viktorov:

Скажи мне пожалуйста, для чего в коде такая функция

Зачем тройная проверка?

Разве SymbolInfoTick не достаточно? Или оплата идёт от количества строк кода?

это я - что бы наверняка, сработало. - Просто ещё буду добавлять из другого кода, а там присутствует эта функция.

 
SanAlex:

это я - что бы наверняка, сработало. - Просто ещё буду добавлять из другого кода, а там присутствует эта функция.

Читай документацию и внимательней разбирай ***код, откуда копируешь функции.

Вот читай свой код

//--- refresh rates
   if(!m_symbol.RefreshRates())

Практически ты получаешь выполнение функции SymbolInfoTick

//+------------------------------------------------------------------+
//| Refresh cached data                                              |
//+------------------------------------------------------------------+
bool CSymbolInfo::RefreshRates(void)
  {
   return(SymbolInfoTick(m_name,m_tick));
  }

которая возвращает bool и по хорошему этого достаточно. Но только не для тебя. Ты ставишь ещё одно условие: если функция вернула false, то вернуть false. Дальше-больше… Если функция вернула false, то дальше код не выполняется, а если вернула true то условие

//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)

выполнено не будет. Зачем оно тут?

Не копируй ***код, включи голову. Как это делать Путин показал, посмотри…

 
SanAlex:

Спасибо! буду исправляться. по ходу действия я прочитываю документацию и смотрю примеры, но все равно , наверное мне не дано, не зря я двоечником в школе был, за то по спорту был 

чемпионом советского союза по тяжёлой атлетике  

Представляешь, я тоже не троечником был. Восьмой класс закончил имея 4 по математике и 5 двоек… Директор разрешил сдать зачёты по этим предметам с условием, что я уйду в ПТУ.