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

 
STARIJ:
下面是这个。

鼠标点击图形对象的事件

鼠标点击

X坐标

Y坐标

发生事件的图形对象的名称


呃,我想我已经明白了)
谢谢你的帮助!

 

我不知道如何将结果 "r "连接到一个缓冲区以在图表上显示,请指教。

我无法理解教科书中的例子,我问过别人

他们写道--"将 "r "的值写入缓冲区,它就会出现在图形上。"和 "通常你通过for循环向缓冲区写入。"

但这并不能说明什么!

一个结果是只有字母 "r",仅此而已,我在任何地方都找不到它。


还有一件事

例如,如何将结果 "r "平滑化。

谢谢您的关注!
 

错误是什么?当在测试器中运行时,该函数会删除挂单,有时不会。为什么?操作原理如下:当买入订单被TP平仓时,买入限价被移除。请告知

////+------------------DELETE BUYLIM-----------------------------------+
   if((SchBuyLimLots(Symbol())-SchBuyLots(Symbol()))!=0)                  //  лот байлимит НЕ лот бая
     {     
      for(int i=0;i<OrdersTotal();i++)
        {
         datetime T_op=0,T_lim=0,buys=0;
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=SMB_) continue;
         if(OrderType()==OP_BUY)
         if(OrderCloseTime()>buys) buys+=OrderCloseTime();
         buys= OrderCloseTime();
         T_op=buys;                                                       //  время закрытия бая
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=SMB_) continue;
           {
            if(OrderType()==OP_BUYLIMIT)
              {
               T_lim=OrderOpenTime();                                     //  время закрытия селл
               ticket=OrderTicket();
               if(T_lim<=T_op)                                            //  разность
               res=OrderDelete( ticket,clrMagenta);
               if(res<1)
               {
                  Print(GetLastError());
               }
              }
           }
        }
     }
 
ZZuretc:

错误是什么?当在测试器中运行时,该函数会删除挂单,有时不会。为什么?操作原理如下:当买入订单被TP平仓时,买入限价被移除。请告知。


OrdersTotal() != OrdersHistoryTotal()

 
Alexey Viktorov: 我自己还没有研究过其中的奥妙。

谢谢你。

 
你能告诉我如何找到 当前ATR的最大值 和最小值吗?
附加的文件:
q6a0hh.PNG  12 kb
 

大家好。

基于Stochstick做了一个简单的专家顾问(在顶峰时卖出,在底峰时买入),而编译器当场给出了一个错误。

谁能告诉我这是什么原因,这个错误是什么意思?起初我以为我忘了在某个地方加一个括号。

但是没有,我检查了好几次,似乎支架一切正常。我将非常感谢您的帮助。

下面是编译器产生的错误:')'- 不是所有的控制路径都会返回一个值 Stohastic-Signals-33.mq4 177 3

')'- 不是所有的控制路径都会返回一个值 Stohastic-Signals-33.mq4 210 3

这里是专家顾问本身和一个mq4文件的附件。

请告知如何将专家顾问附在这个文件上(在编辑器中用彩色字母)。

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

//| Stohastic-Signals-33.mq4

//| Copyright 2017, MetaQuotes Software Corp.

//| https://www.mql5.com |

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

#property copyright "Copyright 2017, MetaQuotes Software Corp."

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

#财产版本 "1.00"

#属性严格

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

bool New_Bar=false; // 新条的标志。

extern double H_line=80; // Stochastic upper (overbought) line.

extern double L_line=20; // Stochastic的下线(超卖)。

外部inttern Slippage=2; // Slippage

extern int SL; // 被设置的订单的SL。

extern int TP; // 被设置的订单的TP。

外部双Lts; //Lot大小的订单被设置。

bool B_Flag=false; // BUY的信号标志。

S_Flag=false, // 卖出信号的标志

ORD_Buy=false, // 标志着买入头寸的开启

ORD_Sell=false; // 标志着卖出头寸的开放。

bool Work=true; // 允许专家工作的标志。 true-没有关键错误,false-存在。

string Symb; // 金融工具的名称

int Crit_Error=11111111; // 关键错误的数量

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

//|专家勾选功能|

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

空白的OnTick()

{

䵮䵮

总数, // 窗口中的订单数

Tip=-1, // 选择的订单类型(B=0,S=1)。

Ticket; // 订单号

M_1, M_2, M_3, // 1、2、3小节的MAIN值

Lot; // 所选订单中的手数

bool Ans_Close; // 关闭订单成功的标志(1-关闭,0-未关闭)。

bool Ans_Open; // 标志着订单是否被成功打开(1-关闭,0-未打开)。

//--------------------------------------------------------------- 1 --

// 检查是否有重大错误

如果(Work==false) // 严重错误

{

警告("严重错误,专家顾问不工作;)

return; // 从start()退出。

}

//--------------------------------------------------------------- 2 --

// 新酒吧

Fun_New_Bar(); // 函数的调用。

如果(New_Bar==false)//如果条形图不是新的。

return; // ...然后退出

//------------------------------------------------------------- 3 --

// 顺序计数

Symb=Symbol(); // 金融工具的名称。

总数=0; // 订单数量

for(int i=1; i<=OrdersTotal(); i++) // 订单循环

{

如果(OrderSelect(i-1,SELECT_BY_POS)==true) //如果

{ // 订单分析。

如果(OrderSymbol()!=Symb)继续; // 不是我们的金融工具

Ticket=OrderTicket(); // 选择的订单号。

Tip =OrderType(); // 所选订单的类型。

Lot=OrderLots(); // 手数的多少

}

否则

{

Alert("OrderSelect() returned an error - ",GetLastError()); // If order could not be selected, then.

return; // 退出

}

}

//------------------------------------------------------------- 4 --

// 贸易标准 形势分析

M_1=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,1);// 1条

M_2=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,2);// 2条

M_3=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,3);//3 bar

//------------------------------------------------------------- 5 --

如果(M_2>=H_line) // 如果随机指数已经越过超买线

{

if(M_3 <= M_2 && M_2 > M_1) // 随机指数已经越过超买线 {...

{

如果(S_Flag==true) // 如果(Sell position opened, then ...

return; // 退出start()

// 如果卖出位置没有打开,那么......。

S_Flag=true; //我们设置一个标志,表明卖出信号已经出现。

B_Flag=false; // 检查买入信号是否已经出现。

if(ORD_Buy==true) // 如果买入订单已被打开,...

{

if(Tip!=0) // 检查:订单类型与开仓订单不一致...

{

Work=false; //专家顾问将不工作。

Alert("订单类型与未平仓订单FLAG不一致。 退出开始。"); // 如果匹配不存在,专家顾问停止工作。

return; // 从起点退出

}

Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip); // Close the open Buy order.

if(Ans_Close==false) // 如果关闭失败,那么。

{

Alert("Failed to close the order.Expert Advisor停止工作。Critical error number ", Crit_Error)。

return; // 退出

}

}

Ans_Open=Open_Order(Symb,Lts,SL,TP,1); // OPEN POINTS

如果(Ans_Open==false) // 如果卖出失败

{

Alert("Failed to open order.Expert Advisor停止工作。Critical error number ", Crit_Error)。

return; // 从起点退出

} // 如果Sell被成功打开

ORD_Sell=true; //我们设置了一个标志,表明一个空头头寸已经被打开。

ORD_Buy=false; // 将长线头寸标记为消失。

}

return; // 退出开始

}

//------------------------------------------------------------------------ 6 --

如果(M_2<=L_line) // 如果随机指数已经越过超卖线。

{

如果(M_3 >= M_2 && M_2 < M_1) // 底部峰值出现(买入看涨)

{

如果(B_Flag==true)//如果买入头寸已经打开

return; // 退出start()

// 如果没有建立买入头寸,那么...

B_Flag=true; // 买入头寸的标志为正数。

S_Flag=false; // 检查是否没有卖出信号

if(ORD_Sell==true) // 如果有一个开放的卖出订单,...

{

if(Tip!=1) // 检查:订单类型与开仓订单不一致...

{

Work=false; //专家顾问将不工作。

Alert("订单类型与未平仓订单FLAG不一致。 退出开始。"); // 如果匹配不存在,专家顾问停止工作。

return; // 从起点退出

}

Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip); // Close the open Sell order.

如果(Ans_Close==false) // 如果关闭失败

{

Alert("Failed to close the order.Expert Advisor停止工作。Critical error number ", Crit_Error)。

return; // 退出

}

}

Ans_Open=Open_Order(Symb,Lts,SL,TP,0); // OPEN LONG POSITION

如果(Ans_Open==false) //如果打开Buy失败了

{

Alert("Failed to open order.Expert Advisor停止工作。Critical error number ", Crit_Error)。

return; // 从起点退出

} // 如果买入订单被成功打开

ORD_Sell=false; // 检查是否有空头头寸

ORD_Buy=true; // 旗帜性地打开长线头寸

}

return; // 退出开始

}

}

//+------------------------------------------------------------------ 7 --

void Fun_New_Bar() // The detection fie .

{ // ......新酒吧。

static datetime New_Time=0; // 当前酒吧的时间。

New_Bar=false; // 没有新条形。

if(New_Time!=Time[0]) // 比较时间。

{

New_Time=Time[0]; // 现在的时间是

New_Bar=true; // 新条被捕获。

}

}

//--------------------------------------------------------------- 8 --

bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Order closing fie

{

double Close_Price=0; // 订单的收盘价。

while(true)

{

RefreshRates(); // 更新数据

if(F_Tip==0) // 如果订单是买入,...

Close_Price=Bid; // 收盘价 Bid

Close_Price=Ask; // 如果订单是卖出,收盘价为Ask。

bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage); // 关闭买入或卖出。

如果(Ans_Close==true) // 它成功了 :)

return(true); // 从关闭函数中退出。

Crit_Error=GetLastError(); // 修复错误编号

如果(Fun_Error(Crit_Error)==1) // 错误处理

continue; // retry; // try again.

return(false); // 从函数中退出。

}

}

//--------------------------------------------------------------- 9 --

//订单开放

bool Open_Order(string F_Symb,double F_Lts,int F_SL,int F_TP,int F_Tip)

{

double Open_Price; //开盘价

string Tip_Deal; //交易方向(买或卖)。

double f_sl; // Stop Loss order

double f_tp; // Take Profit

int Ticket; // 未结订单的票据

while(true) //命令关闭循环。

{

RefreshRates(); // 更新数据

if(F_Tip==1) // 打开卖出...

{

Open_Price=Bid。

Tip_Deal="OP_SELL"。

f_sl=NormalizeDouble(Bid+F_SL*Point,Digits)。

f_tp=NormalizeDouble(Bid-F_TP*Point,Digits)。

}

//-------------------------------- 如果你想打开BUY,那么...

开盘价=询问。

Tip_Deal="OP_BUY"。

f_sl=NormalizeDouble(Bid+F_SL*Point,Digits)。

f_tp=NormalizeDouble(Bid-F_TP*Point,Digits)。

Ticket=OrderSend(F_Symb,Tip_Deal,F_Lts,Open_Price,2,f_sl,f_tp);//打开ORDER

if (Ticket > 0) // 它成功了 :)

return(true); //从函数中退出。

Crit_Error=GetLastError(); //提交错误的编号

如果(Fun_Error(Crit_Error)==1) // 错误处理

continue; // retry; // try again.

return(false); // 从函数中退出。

}

}

//--------------------------------------------------------------- 10 --

int Fun_Error(int Error) //函数处理错误

{

switch(Error)

{// 无法克服的错误。

case 4: Alert("Trade server is busy. Try again...");

Sleep(3000); // 简单的解决方案。

return(1); // 退出函数。

case 135:Alert("Price changed. Try again...")。

RefreshRates(); // 刷新数据。

return(1); // 从函数中退出。

case 136:Alert("No price. Waiting for a new tick...")。

while(RefreshRates()==false) // 读取一个新的刻度线

Sleep(1); // 循环中的延迟。

return(1); // 从函数中退出。

case 137:Alert("Broker is busy. Try again...");

Sleep(3000); // 简单的解决方案。

return(1); // 从函数中退出。

case 146:Alert("The trading subsystem is busy. Try again...");

Sleep(500); // 简单决定

return(1); // 从函数中退出。

// 严重错误

case 2: Alert("General error;)

return(0); // 从函数中退出。

case 5: Alert("旧版本的终端。")。

Work=false; // 不再工作

return(0); // 从函数中退出。

case 64: Alert("Account blocked.");

Work=false; // 不再工作

return(0); // 从函数中退出。

case 133:Alert("禁止交易。")。

return(0); // 从函数中退出。

case 134:Alert("没有足够的钱来执行交易")。

return(0); // 从函数中退出。

默认:Alert("An error has occurred",Error); // Other options

return(0); // 从函数中退出。

}

}

//-------------------------------------------------------------- 11 --



附加的文件:
 
RomanRott: 你能告诉我如何找到 当前ATP的最大值 和最小值吗?
   double max=-10000, min=+10000, ATR;
   for(int n=0; n<WindowFirstVisibleBar();n++)
   {
      ATR=iATR(NULL, 0, 14, n);
      if(max<ATR)max=ATR;
      if(min>ATR)min=ATR;
   }
   Alert("min = ", DoubleToStr(min,4), "    max = ", DoubleToString(max,4));
对于其他指标也是如此
 
Skander: 大家好。在Stochstic的基础上做了一个简单的专家(在顶部的峰值卖出,在底部的买入),编译器在一个平面上给出了一个错误。
谁能告诉我这是什么原因,这个错误是什么意思?起初我以为我忘了在某个地方加一个括号。
但是没有,我检查了几次,一切似乎都很好。我将非常感谢您的帮助。
下面是编译器产生的错误:')'- 不是所有的控制路径都会返回一个值 Stohastic-Signals-33.mq4 177 3
')'- 不是所有的控制路径都会返回一个值 Stohastic-Signals-33.mq4 210 3
//--------------------------------------------------------------- 8 --
bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Order closing fie
{
double Close_Price=0; // 订单的收盘价。
while(true)
{
RefreshRates()。// 刷新数据
如果(F_Tip==0)// If(Buy order, ...
Close_Price=Bid; // 收盘价 Bid
收盘价=报价。// 如果是卖出订单,收盘价为Ask
bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage); // 关闭买入或卖出。
如果(Ans_Close==true)// 它成功了。)
return(true)。//从关闭函数中退出
Crit_Error=GetLastError()。// 提交错误编号
如果(Fun_Error(Crit_Error)==1) // 错误处理
继续。// 重试
return(false)。// 退出该函数
}
}

在MetaEditor中按下编译按钮,阅读错误信息--有一个行号和位置号

//--------------------------------------------------------------- 8 --
  bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip)    // Ф-ия закрытия ордера
  {
   double Close_Price=0;                       // Цена закрытия ордера 
   while(true)
     {
        ....................................
            continue;                           // Повторная попытка
         return(false);                                // Выход из функции
     }
     return false;   // Компилятор хочет return в конце функции
  }

用SRC按钮插入程序代码--本地读者更喜欢这种方式!!你的长篇大论是BRRRR。

编码 按钮用于在信息文本中插入源代码。点击后,会出现一个空窗口,你需要在那里粘贴代码,然后点击插入 按钮。

 
STARIJ:

在MetaEditor中按下编译按钮,阅读错误信息--有一个行号和位置号

用SRC按钮插入程序代码--本地读者更喜欢这种方式!!你的长篇大论是BRRRRR。

该按钮用于将源代码插入帖子的文本中。点击后,会出现一个空窗口,你需要在这里粘贴代码,然后点击插入 按钮。


谢谢你。

原因: