初学者的问题 MQL4 MT4 MetaTrader 4 - 页 112

 
Николай Цепелев:

你好。我在我的EA中写了这样一个地段的计算。

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2)。

其目的是为了获得正确的手数,而不考虑账户货币和货币对的指定风险和停止损失。 风险 ,设定为触发止损时损失的百分比。止损 SL ,单位为点(其中点是货币对价格的最小可能变化)我准备在一个真实的账户 上启动这个EA。但我有疑虑。如果有更有经验的程序员能告诉我可能出现的错误,我将非常感激。
首先是战略测试仪。然后我们有一个模拟账户。然后才是真正的账户。为了检查这个公式,写一个脚本。或者只是在一张纸上计算一下。我把余额=100,风险=0.1 SL=100,Tick=0.00001 手数=100*0.1/(100*0.00001)=10/0.001=10000手比余额多?我们应该考虑杠杆作用吗?
 
STARIJ:
第一个战略测试员。然后是一个模拟账户。然后才是一个真正的。为了检查这个公式,写一个脚本。或者只是在一张纸上计算一下。我把余额=100,风险=0.1 SL=100,Tick=0.00001 手数=100*0.1/(100*0.00001)=10/0.001=10000手比余额多?我们应该考虑杠杆作用吗?

MarketInfo(Symbol(),MODE_TICKVALUE))没有返回最小的tick size。它写在帮助中。

工具价格 在存款货币中的最小变化 大小。


但事实上,它返回的是1手合约的符号价格在存款货币中的最小变化值。


在你的例子中,MarketInfo(Symbol(),MODE_TICKVALUE))将返回1,然后一切都正确了我在真实的美元和卢布账户上试了一下,它是有效的。以下是我用来检查的脚本。

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#属性链接 "https://www.mql5.com"

#财产版本 "1.00"

#属性严格

#property show_inputs

外来的双倍风险=0.10。

外来的int sl=1000。

//+------------------------------------------------------------------+

//| 脚本程序启动功能|

//+------------------------------------------------------------------+

空白的OnStart()

{

Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2))

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

你是对的。用脚本进行检查更快、更可靠

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
你的剧本在屏幕上占了19厘米的高度,我的是8.1厘米--一半的高度。而且颜色也不同
 

我们还需要使NormaliseDouble函数的精度取决于允许的最小批量。如果你向OrderSend函数 传递一个手数,例如0.11,而该工具只用0.1倍的手数进行交易,将会出现错误。

 

我不明白为什么未平仓的交易没有一次性删除,即EA删除了一些交易,但错误orderdelete 4108,市场订单不能删除几次,只有这样才能删除。

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

我不明白为什么未平仓的交易没有一次性删除,即EA删除了一些交易,但错误orderdelete 4108,市场订单不能删除几次,只有这样才能删除。

本页解释了 如何删除。你有2个错误。

 
下午好。我在请求帮助。我在网上和论坛上搜索了一下。我正在测试标准模式下的专家顾问,一切正常。没有错误或警告。我下载了tick数据并添加了。(我所做的一切正如这里所描述的--如何测试质量为99%的专家顾问系统--简单、免费、合法)以及这里 - "如何在Metatrader 4策略测试器中 获得99%的模拟质量")启动时不断出现错误'array out of range in 'expert1.0.mq4' (69,25)...我明白,这是关于一个数组。我不知道该怎么做。但由于在标准模式下一切都很好...请帮助
 
qroner:
在启动时,'expert1.0.mq4'(69,25)有一个恒定错误阵列超出范围...我明白,这与阵列有关。我不知道该怎么做。

需要看到处理这个数组的代码,或其中的一段。

心灵感应者们,今天好好休息一下吧。

 
Konstantin Nikitin:

你需要看一下处理阵列的代码或一段代码。

心灵感应者们,今天好好休息一下吧。

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0)。
int Ticket=-1;
for(int pos=OrdersTotal()-1; pos>=0; pos--){
如果(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&)
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket()。
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

这里有一个功能。

我只是认为问题不在代码中,因为在标准模式下没有错误。

原因: