Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 938

 
Seric29:

Такой вопрос: я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться datetame, с 10 по 14 будет храниться int. Возможно ли организовать такое в mql4, если да покажите как, я видел пример со структурами но это было в с++ но я потерял ссылку на сайт?

Если у Вас для каждого типа отведены определённые ячейки массива, то сделайте вместо массива структуру.

 
Koldun Zloy:

Если у Вас для каждого типа отведены определённые ячейки массива, то сделайте вместо массива структуру.

к сожалению он даже формализовать задачу не может

с одной стороны общение выглядит, что он хочет уйти от строгой типизации в С++ / MQL , вот хороший топик с обсуждением, хотя сомневаюсь, что ему это поможет  https://www.mql5.com/ru/forum/294094

в ходе обсуждения (по моему уже месяца 3 продолжается? ) постоянно выясняется, что @Seric29 нужно еще уйти и от описания сигнатуры функций и получить некую функцию "фантом" в который можно передавать произвольное количество параметров

потом в ходе обсуждения выясняется, что во всем этом должны участвовать многомерные динамические массивы, причем эти массивы должные быть переданы в функцию в качестве параметров

т.е. тут вообще не формализованная задача, решение которой постоянно заканчивается "выкриками с места", разработчики урезали функционал чего то  и дайте мне исходные коды то операторов цикла, я их переделаю, то вот последнее:

Seric29:
Как написать письмо разработчикам mql4 как увидеть код компилятора, можно ли в него внести дополнительные возможности чтобы он не был таким статическим?

... в общем как то так... фраза "вынос мозга" это самое малое, что можно сказать ))))

 

Поэтому и не даю никаких подробностей.

От изучения основ ни куда не убежишь.

 
Koldun Zloy:

От изучения основ ни куда не убежишь.

тут интересно что человек не учит основы, а пытается показать что он это всё уже знает, а вы все метаквоты мешают ему делать работу)

 
Taras Slobodyanik:

тут интересно что человек не учит основы, а пытается показать что он это всё уже знает, а вы все метаквоты мешают ему делать работу)

Приветствую. Посмотрел грамотный ролик "Из MQL4 в MQL5 - как переписать советник под Metatrader 5".
Большой респект автору. Решил сам попробовать. Написал. Идея такая :
1. В инпутах устанавливаю dtriger = 1  - открывается Buy.
2. В инпутах устанавливаю dtriger = -1 - открывается Sell.
3. В инпутах устанавливаю dtriger = 0  - закрываются все открытые.
Читал в хелпах, что  в MT5 не возможно держать встречные позичии,
а у меня они присуствуют.
Вопрос : как корректно прописать закрытие действующей позиции при
открытии стречной (переворотной).
Премного благодарен.

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo    o_position;
CTrade          o_trade;
CSymbolInfo       o_symbol;
COrderInfo       o_order;

input int       triger         = 0;
input double    StartLot         = 0.01;
input double    lpos_volume      = 1.0;
input int       Step            = 10;
input int       MagicNumber      = 12345;    //    Magic    nuaber
input int       Slippage         = 30;       //    slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
  
   RefreshRates();
  
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   {
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   {
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
  
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime                lpos_time           =    0;
      double                lpos_price_open    =    0.0;
      ENUM_POSITION_TYPE   lpos_type           =    -1;
      int                   pos_count           =    0;
      double                sum_profit           = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            { 
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             } 
           
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }    
       }    
    }         

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--)
   {
      if (o_order.SelectByIndex(i))
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
    
   if(dtriger == 0 )
   {
      CloseAll();
      return;              
   }
  
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
     
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                         

// +  -----   Переворот    ++++++++++++++++++++++++++++  

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0)
     DeleteStopOrders() ;
 
}
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
    
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
     
    return(true);

//---  ---------------------------------------------------------
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
 
   return((filling && fill_type) == fill_type) ;
}
 
 //  --------------------------------------------------
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      } 
    }
 }
 
 //-----------------------------------------------------------
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 }
 
//+------------------------------------------------------------------+

 
procom:

Приветствую....

Пожалуйста, вставляйте правильно код:


 
Artyom Trishkin:

Пожалуйста, вставляйте правильно код:


ok
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
Файлы:
Stend_t1.mq5  12 kb
 
Igor Makanu:

начните читать хоть какую нибудь книгу по С++, Ваши вопросы это взрыв мозга, Вы пишете технические термины, на первый взгляд кажется, что Вы задаете конкретный вопрос, а по сути Вы просто оперируете терминами без понимания сути.... что макрос вернет? куда вернет? в теле макроса перезагружаемая функция.... я даже не могу обьяснить как выглядит Ваш вопрос.

Чтобы понять что такое макрос, пишите этот термин правильно, макроПОДСТАНОВКА , может быть Вам будет проще понять, что это

В mql4 урезаны возможности и с++, другими словами слишком статический язык. Можно сказать что моя идея провалилась, я написал простую перегрузку без классов я добавлял аргументы и присваивал им 0, пытался вызвать в макросе выбило ошибку что функций 3, т.е. получается нужно ещё расписывать какую вызвать и как я молчу о том с какими камнями столкнусь позже. Наверное лучше ничего не делать тогда не ошибёшься.

 
Seric29:

В mql4 урезаны возможности и с++, другими словами слишком статический язык. 

что хоть урезали, конкретно?

другими словами не нужно, тем более даже гугл не знает "слишком статический язык", С++ он изначально  статически типизированный язык и размышления просто бессмысленны - он просто такой

Seric29:

Наверное лучше ничего не делать тогда не ошибёшься.

буду краток RTFM ( lurkmore )

 

Вопрос чисто эстетики.

Как сделать так, чтобы вот здесь была собственная картинка? MT4



Причина обращения: