任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 1104

 
shtr:

大家好!

你能告诉我为什么订单不能打开吗?

初始化就是初始化,贸易就是初始化。EAs有OnTick,没有必要把所有东西都塞进init...

而对于inite来说,有开发人员发明的特殊退出代码,你为什么不使用它们?

 
evillive:

Initu是指initu,trade是指togo。EAs有OnTick,没有必要把所有东西都塞进init...

而对于inite,有开发人员发明的特殊退出代码,我们为什么不使用它们呢?

可能是因为我们不知道内部的终止代码。教程中的例子与编辑器中的形式不同。例如,那里缺少int start()函数。当我把教程中的简单专家顾问的例子 粘贴到inite中时,不知怎么就成功了。但无论我写什么,都没有效果。所以我决定,经过两周的实验,向专家咨询。谢谢你的提示!

我把它全部放入OnTick,但没有任何变化。

 
shtr:

我们不使用它,一定是因为我们不知道启动完成代码。教科书中的例子与编辑器中的形式不同。例如,那里缺少int start()函数。当我把教程中的简单专家顾问的例子粘贴到inite中时,不知怎么就成功了。但无论我写什么,都没有效果。所以我决定,经过两周的实验,向专家咨询。谢谢你的提示!

把它全部扔进OnTick,但没有任何变化。

忘了这个教程吧,它是用旧的语法写的,从那以后有很多变化。终端交付的帮助是最相关的,而kodobase,如果你看的话,也是MQL新版本的例子来源。

而关于不在inite中写所有的代码,以前是这样的,在论坛中搜索一下,这个论坛的各种语言都有数百个帖子,只是每次都有新的作者不是读者;)

 
evillive:

忘了这个教程吧,它是根据旧的语法写的,从那时起,很多东西都变了。终端交付的帮助是最相关的,而kodobase,如果你看的话,也是MQL新版本的例子来源。

关于不在inite中写所有代码的问题,以前是这样的,在论坛中搜索一下,这个论坛有数百个各种语言的帖子,只是每次都有一个新的作者,他不是一个读者;)

谢谢!

旧的教科书,一旦失去意义,就应该立即被扼杀))

 
shtr:

谢谢你!

旧的教程,一旦失去意义,就应该立即被抽走))

不要把所有的东西都扔到OnTick里,只有与交易有关的部分,只在启动时运行的那部分代码应该留在OnInit里(当然,函数的名字应该用拉丁文写,只是懒得每次都在论坛上改变布局)。

关于代码本身,有关于循环的问题,这很奇怪,在我看来,没有足够的大括号。

是的,而且对于计算损益水平,也没有正确规定。服务器应该发送价格,最好是标准化的,而不是以点为单位的数值。

 
evillive:

还有,不要把所有的东西都放在OnTick里,只放与交易有关的东西,部分只在启动时触发的代码应该留在OnInit里(当然,函数名应该用拉丁文写,只是懒得每次都在论坛上改布局)。

关于代码本身,有关于循环的问题,这很奇怪,我认为大括号不够多......。

是的,也是为了计算损益水平,它们的规定是不正确的。服务器应该发送价格,最好是标准化的,而不是以点为单位的数值。

我知道了,谢谢。我将检查括号 - 编辑器没有产生错误。

为什么书中的例子会成功?我记下了所有的函数,只插入了示例代码,从int start开始。没有任何错误,交易就这样开始了。

 
shtr:

明白了,谢谢。我将检查括号 - 编辑器没有给出任何错误。

为什么书中的例子会成功......?我删除了所有的函数,只插入了示例代码,从int开始。没有任何错误,交易就这样开始了。

好吧,我没有必要去交易那些有用的东西 ))))

如果你的问题是关于启动和ontik在新方式上的区别,你应该已经把所有东西从启动转移到ontik。或者说在你的例子中,从OnInit到OnTick。

编译器会记录语法错误,除了人之外没有人检查逻辑。在特殊情况下,甚至代码的作者也会感到困惑 :)

 
evillive:

好吧,有效的东西不需要被交易))))。

而且,对于EA来说,start是旧的方式,OnTick是新的方式,所以你应该把所有东西从start移到OnTick。或者说在你的案例中,从OnInit到OnTick。

编译器会记录语法错误,除了人之外没有人检查逻辑。在特殊情况下,甚至代码的作者也会感到困惑 :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright"Copyright 2016, MetaQuotes Software Corp."
#属性链接 "https://www.mql5.com"
#财产版本 "1.00"
#属性严格
外来的int MA_1=5。
外来的int MA_2=20。
外置的MA_3=80。
外部inttern TP=100。
extern int SL=50;
外来的双数Lot=0.1。
字符串 Symb;
//+------------------------------------------------------------------+
//|专家初始化功能|
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED)。
}

//+------------------------------------------------------------------+
//|专家去初始化函数|
//+------------------------------------------------------------------+
空白的OnDeinit(const int reason)。
{
//---
}
//+------------------------------------------------------------------+
//|专家打勾功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
双重MA_1_t。
双重MA_2_t。
双重MA_3_t。
总数。
int pos;
Symb=Symbol()。
总计=0。
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES)。
如果(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0)。
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0)。
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0)。
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits)。
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen);
返回。
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits)。
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "My order",16384,0,clrRed);
返回。
}
返回。
}
//---

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

"好吧,有效的东西不需要兜售))"好吧,你想自己潦草地写点什么)。

病人在被操纵后并没有清醒过来。

 
shtr:

"好吧,你不应该把有用的东西换掉。"))。好吧,你想自己潦草地写点什么)。

操纵之后,病人并没有清醒过来。

好吧,逻辑和数学都很蹩脚,很明显不会这样。

例如,为什么我们在这个EA中需要一个循环?我的意思是,很明显,我们需要计算给定的符号和魔术师的订单有多少已经下了,对吗?但我们在这里看到的是,循环没有计算任何东西,也不能计算,因为它没有一个 "计数器 "被拧在))))

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() 返回一个布尔值,即真或假,这对pos变量来说是不合适的。而且,循环最好从最古老的顺序开始,即按相反的顺序,以避免跳过顺序。

总数变量可以作为一个计数器使用。

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

我删除了不必要的东西,在OrderSend后增加了错误输出,对于非ECN账户的测试者,订单已经打开。

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

哦,对了,还有销售的SL水平的计算是错误的,我们应该更加注意。

 
evillive:

好吧,逻辑和数学都很蹩脚,所以很明显,它不会像那样工作。

例如,为什么这个EA中会有一个周期?我的意思是,很明显,我们需要计算我们有多少个给定的符号和魔法数字的订单,对吗?但我们在这里看到的是,循环没有计算任何东西,也不能计算,因为它没有一个 "计数器 "被拧在))))

OrderSelect()返回一个布尔值,即真或假,这对pos变量来说是不合适的。而且,循环最好从最古老的顺序开始,即按相反的顺序,以避免跳过顺序。

总数变量可以作为一个计数器使用。

我删除了不必要的东西,在OrderSend之后增加了错误输出,对于非ECN账户的测试者,订单已经打开。

哦,对了,还有销售的SL水平的计算是错误的,你需要更加小心。

哇!!!谢谢!!!。这需要进行一些思考。

也许某处有关于新规则的 "自学"?4位数的页码让人有点紧张...