新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 938

 
Seric29:

我想创建一个一维数组,其中0到4的元素将存储双数,5到9将存储数据名,10到14将存储int。是否可以用mql4来组织? 如果可以,你能告诉我怎么做吗?我在C++中看到过一个带结构的例子,但我已经失去了网站的链接?

如果你为每种类型分配了特定的数组单元,那就做一个结构而不是数组。

 
Koldun Zloy:

如果你为每种类型分配了特定的数组单元,那么就做一个结构而不是数组。

不幸的是,他甚至不能将任务正式化

一方面,看起来他想摆脱C++/MQL中严格的类型化,这里有一个很好的讨论主题,虽然我怀疑这对他有帮助https://www.mql5.com/ru/forum/294094

在这个讨论的过程中(我想它已经持续了3个月?),事实证明,@Seric29 需要摆脱对函数签名的描述,得到一个接受任意数量参数的 "幻影 "函数

然后在讨论中发现,多维动态数组应该参与这一切,这些数组应该作为参数传入函数中

也就是说,这是一个不正规的任务,其解决方案不断地以 "来自现场的呼喊 "而告终,开发人员减少了一些功能,并给我循环运算符的源代码,我将重做它们,然后是后者。

塞里奇29
如何给mql4的开发者写一封信,如何看到编译器的代码,有没有办法给它增加更多的功能,让它不那么静态?

...就这样吧..."令人震惊 "这句话是你可以说的最起码的一句话 ))))

 

这就是为什么我没有给出任何细节。

学习基础知识是无法摆脱的。

 
Koldun Zloy:

学习基础知识是无法摆脱的。

有意思的是,一个人不学习基本知识,却试图表明他已经知道这一切,而你们都是 元气大伤,阻止他做他的工作)

 
Taras Slobodyanik:

有意思的是,这个人不是在学习基础知识,而是想表明他已经知道了,而你们都是 元气大伤的人,妨碍了他的工作)

问候。我看了专家顾问视频 "从MQL4到MQL5 - 如何为Metatrader 5重写一个EA"。
非常感谢作者。我已经决定自己尝试。我决定自己尝试一下。该想法如下。
1.我在输入中设置了dtriger = 1 - 买入打开。
2.我设置dtriger = -1 - 卖出开盘。
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;
秩序信息o_order。

输入int triger = 0。
输入 double StartLot = 0.01;
输入 double lpos_volume = 1.0;
输入int Step = 10;
输入 int MagicNumber = 12345; // Magic nuaber
输入 int Slippage = 30; // 滑移量

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| 专家初始化功能|
//+------------------------------------------------------------------+
int OnInit()
{
dStep = Step ;
dtriger = triger ;

如果(!o_symbol.Name(Symbol()))
return(INIT_FAILED)。

RefreshRates()。

o_trade.SetExpertMagicNumber(MagicNumber)。

如果(IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK)。
}
否则如果(IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC)。
}
否则
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN)。
}
o_trade.SetDeviationInPoints(Slippage)。

如果(o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEEDED)。
}
//+------------------------------------------------------------------+
//| 专家去初始化功能|
//+------------------------------------------------------------------+
空白的OnDeinit(const int reason)。
{
}
//+------------------------------------------------------------------+
//|专家勾选功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
日期时间lpos_time = 0。
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
䵮䵮pos_count = 0。
double sum_profit = 0;

for (int i = PositionsTotal() - 1; i>=0; i--)
{
如果(o_position.SelectByIndex(i))
{
如果(o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
如果(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--)
{
如果(o_order.SelectByIndex(i))
{
如果(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

如果(!RefreshRates())
返回 ;

如果(dtriger == 0 )
{
CloseAll()。
返回。
}

// + ----- 打开第一单 ++++++++++
如果(pos_count == 0 && stop_count == 0 )
{
如果 ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}

如果 ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}


// + ----- 反向++++++++++++++++++++++++++++

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

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


如果(pos_count>0 && stop_count>0)
DeleteStopOrders()。

}
//-----------------------------------------------------------
bool RefreshRates()
{
如果(!o_symbol.RefreshRates())
return(false) ;

如果(o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false)。

return(true)。
}
//--- ---------------------------------------------------------
bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(符号,SYMBOL_FILLING_MODE)。

return((fill && fill_type) == fill_type) ;
}

// --------------------------------------------------
空白的CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
如果(o_position.SelectByIndex(index))
{
如果(o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)。
{
o_trade.PositionClose(o_position.Ticket())
}
}
}
}

//-----------------------------------------------------------
// 删除所有挂单
//-------------------------------------
空白 删除订单(DeleteStopOrders)。
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
如果(o_order.SelectByIndex(i))
如果(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:

至少要开始读一本关于C++的书,你的问题很爆炸,你写的是技术术语,乍一看你似乎在问一个具体的问题,但实际上你只是在术语上操作,而没有理解本质....,宏会返回什么?会在哪里返回?在宏的主体中,一个可重载的函数....。我甚至无法解释你的问题是什么样子的。

要了解什么是宏,请正确地拼写术语,即macroSETTING ,也许你会更容易理解它是什么。

在mql4中,功能和C++都减少了,换句话说,它是一种过于静态的语言。我可以说我的想法失败了,我写了一个简单的没有类的重载,我添加了参数并给它们0,我试图在宏中调用它,我得到了一个错误,说有3个函数,所以事实证明我还需要描述哪一个要调用,如何调用,我不说以后要处理什么样的绊脚石。也许最好不要做任何事情,那么你就不会犯错。

 
Seric29:

mql4有削减功能和c++,换句话说是太静态的语言。

究竟削减了什么?

换句话说,你不必,尤其是连google都不知道"太 静态的语言",C++是一种静态类型的语言,思考它是没有意义的,它就是这样。

塞里奇29

也许最好不要做任何事情,那么你就不会犯错。

我将是简短的RTFM(潜伏更多)。

 

这个问题纯粹是一个美学问题。

我怎样才能使它在这里有一张自己的照片呢?MT4