初学者的问题 MQL5 MT5 MetaTrader 5 - 页 54

 
我的哥哥在这里。我想我明天会去。
 
Merkulovv_Artem:

请告诉我错误在哪里。 我得到了准确的数值,但我不能使 "Obem_Pozic "的数值为1.00,这样我就可以计算出显示的手数,我不想把它规范化,它只是给出了4位小数。

我是用MQL4写的。

我在适当的论坛上询问MQL4的情况,这里是A。


你应该使用DoubleToStr() 来在屏幕上显示更准确的数值。

DoubleToStr - Документация на MQL4
  • docs.mql4.com
DoubleToStr - Документация на MQL4
 
Yedelkin:

这一对可能是由终端提供的,它只需要被连接。如果是手动,那么在市场观察中。而如果是长大的,应该用SymbolSelect() 手动完成。

只要你有一个错误,其他的就会随之而来。第一个错误是在终端的底部。因此,我们应该努力消除第一个错误,然后我们再看 :)

谢谢!!!。理解得非常好,写得也很好。我的EA中确实有SymbolSelect()。我把它和代码一起贴在第1页上。53,如果你需要它,你可以看到它。我在帮助下进行了检查--它是正确的!!!。那么,如果这一对是由终端提供的,我应该怎么想?

此外,如果第一行的错误是在终端的底部。为什么打印机错误信息和终端信息不交替出现--不,它们被归为一组?

也许终端没有报告这个函数的错误?

 
显然不是这个!!!。或者这个,但不是这样的。起初,程序信息(打印机)和来自终端的信息真的交替出现,然后突然--而且是10-12次,突然出现了非常错误的4002!!。
 
我也许还是应该在代码中寻找...在哪里我可能有一个指标
 
Dimka-novitsek: 我在我的EA里有SymbolSelect()。我把它和第53页上的代码一起贴了出来。53,如果你需要看到它。

是的,我可以看到。让我们这样试一试。

ResetLastError();
if(SymbolSelect(a_symbol,true)) Print("Символ ",a_symbol," успешно выбран");
else Print("Неудача с выбором символа ",a_symbol,", error = ",_LastError);
 

谢谢你!!!。!!

请告诉我可变时限的印刷品应该是什么样子的,可以是数字的吗?我看到一个,我是说数字一显示出来了。

///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 double  iMAf( string symbol, ENUM_TIMEFRAMES timeframe, int period, int mama_shift, ENUM_MA_METHOD mama_method, int applied_pricece, int shift){
 
    Print ( " iMAfsymbol  ",symbol,"    iMAftimeframe ",timeframe,"  iMAfperiod  ",period," iMAfmama_shift  ",mama_shift ,"  iMAfmama_method ",mama_method,
    "  iMAfapplied_pricece ", applied_pricece,"  iMAfshift ",shift);
 
                     MA_handle=iMA(symbol,timeframe,periodd(period),mama_shift, mama_method,applied_pricece);Sleep(2000);
                     //--- если не удалось создать хэндл
   if(MA_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                 symbol,
                  EnumToString(timeframe),
                  GetLastError()); ResetLastError();return (0.0);} 
                     
                    CopyBuffer( MA_handle,0,0,100,MA);
                    ArraySetAsSeries(MA,true);
                     if(shift>99) return(0);
    return( (MA[shift])); } 
                   
///////////////////////////////////////////////////////////////////////////////////////////////////////

我在问为什么。这是一个函数,它有一个带打印的行。因此,从顶部开始的第二个人。

下面是函数的调用

/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symbb)
{
 double MAMA = iMAf( symbb, periodd(TFMA), periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD));
 double point = SymbolInfoDouble(symbb,SYMBOL_POINT);
 
if(SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 3 || SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 5)
{spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD)/10);
point = SymbolInfoDouble(symbb,SYMBOL_POINT)*10;}
 
 if(iClose(symb,TF_Price,0)+(spread*point)+(Min_Distance_from_MA*point)<=MAMA) return(-1);
 if(iClose(symb,TF_Price,0)-(Min_Distance_from_MA*point)>=MAMA) return (1);
 
 
 return(0);
} 

////////////////////////////////////////////////////////////////////

注意,我在调用行中使用了另一个函数。它是用来定罪的时间框架。之所以如此,是因为我的专家顾问已经从4岁开始被剥夺了。我曾在其中使用过开箱。后来,为了以防万一,我在F4时间框架中加入了F,以进一步使用它。

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   ENUM_TIMEFRAMES  periodd(int per)
  {
   switch(per)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }  
  
  
  ///////////////////////////////////////////////////////////////////////////

这就是我所看到的

 
Dimka-novitsek: 请告诉我,时间框架变量打印应该是什么样子,可以是数字吗?我看到一个,我是说数字一显示出来了。

那么,就在这段代码的下面,使用了

EnumToString(timeframe), 
 
谢谢你!我再看看。
 
Dimka-novitsek: 谢谢你!让我再看一下。

我想我已经知道问题可能出在哪里了。我现在就来描述一下。

从图片中,你可以看到EA在M1上运行,时间框架==1,周期==140 这是否正确?

时间框架==1的值很可能表明时间框架==M1。同时,periodd(period)条目意味着periodd(140)。 根据代码,periodd(140)函数必须返回PERIOD_CURRENT 值。因此,事实证明,periodd(140)==M1。
这意味着iMA调用看起来像这样:iMA(symbol,M1,M1...) 我不知道在计算iMA时,第二个参数的值与第三个参数的值重合(即周期与平均周期重合)是否可以接受,但有些东西告诉我这是错误的。