[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 271

 
hoz:

我了解那里的情况。但不清楚为什么要这样实施。

每一个单独的库函数都是整体的一部分,而一个单独的库也是我整个复合库的一部分--没有这种意识,就不可能理解代码。

hoz:

反正你不能以原始形式使用你的库,也就是说,你把所有东西都绑在那里了。每一个功能对他人的包...

而这正是你错的地方。你有没有想过 "平均 "EA的结构?使EA成为个体的是策略条件(即进入/退出条件),其他都是标准代码。我创建专家顾问的方式,包括那些基于订单的专家顾问:我采取一个模板(例如,SAR,如果需要一个网络EA),并连接到它一个额外的库,在其中写一个新策略的条件(我重新创建它)。

hoz:

我不想通过任何方式来检查它。更有甚者,毫无疑问,一切都写得非常得力。我只是不大明白所有的事情,所以我说我不认为如此。我看,我想...但我并不是什么都明白。这就是为什么我问。

P.S. 对于bs_symbol我还是不明白。

要理解实施,你需要理解源数据。这些库的创建能够与任何工具(外汇)以及单货币和多货币模式一起工作,因此引入了bs_symbol全局变量,它包含了当前工具的价值。
 
IIya:

朋友们!我需要帮助来微调一个EA。

有一些代码可以在某些条件 下打开一个订单。条件的执行可以在每一个刻度上进行,因为它被放在int start() 的主体中。

我们需要。

1.在条件执行后(和订单开仓),暂停新订单的开仓,暂停n 个小节。例如,如果EA的时间框架是M30,我需要暂停3个小时,那么暂停应该是6个柱子。

2.这个程序应该在策略测试器中工作。

需要什么代码?以及什么地方才是合适的地方。

iBarShift()函数将帮助你。首先,你需要找出最后一次开单的时间并把它传给这个函数,然后通过与某个数字(在你的例子中是6)相比较来监控这个函数返回的值。
 
TarasBY:
函数iBarShift()将帮助你。首先,你需要找出最后一次开单的时间,并把它传给这个函数,然后通过与某个数字(在你的例子中是6)相比较来监控这个函数返回的值。

让我们一起解决这个问题 )

我们将最后一次开单的时间传递给这个函数,并获得返回的数字。这大约是。

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

好的,我们得到了酒吧的号码。现在我们如何暂停打开6条的订单?

 
IIya:

让我们一起解决这个问题 )

我们把最后一次开单的时间传给函数,得到的返回数字是大约。

好了,我们得到了酒吧的号码。现在我们如何暂停打开6条的订单?

这是一种文盲的做法。

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

但由于它与本案没有直接关系,我们只是不关注它。该计划看起来像这样。

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
在逻辑上没有明显的错误。一步一步地打印代码。交易程序与票据变量的价值相联系。首先,追踪其变化。还要注意全局变量 "TRADECONTEXT "的值 - 其值必须为0。

谢谢你!我就是什么都不懂(((,在这些代码中我就像一只盲目的小猫(((......
 
al7bar:

谢谢你!但我什么都不懂(((),在这些代码中我就像一只盲目的小猫((()......
事实证明,你不是这段代码的作者。那么联系作者就更容易了。
 
TarasBY:

每一个单独的库函数都是整体的一部分,每一个单独的库都是我整个复合库的一部分--没有这种意识,就不可能理解代码。

我正在努力理解它,我碰到了各种各样的细微差别。这就是为什么我问你,因为你最了解。你是作者...

TarasBY:

而这正是你错的地方。你有没有想过 "普通 "专家顾问的结构?使EA成为个体的是它的策略条件(即进入/退出条件),其他都是标准代码。我创建专家顾问的方式,包括那些基于订单的专家顾问:我采取一个模板(例如,SAR,如果需要一个网络EA),并连接到它一个额外的库,在其中写一个新策略的条件(我重新创建它)。

我明白这一点。我只是不想复制整个图书馆。你明白,建立一个基础是比较方便的,有了这个基础,个人工作就会很方便。

TarasBY:

要理解实施,你需要理解初始数据。创建库时,可以使用任何工具(外汇),并在单货币和多货币模式下工作,因此,引入了全局变量bs_symbol,其中包含当前符号的值。

而这个变量在哪里被明确设置,如果它不是一个秘密?:)我在库中看到b-PSI@Base.mqh,它只被声明。

 bs_Symbol,                            // текущий инструмент

但事实上并没有什么进一步的内容。无论如何,当前工具的值默认是通过Symbol() 返回的。那么,为什么我们在这里需要一个变量呢?

 
TarasBY:

这是一种文盲的做法。

但是,由于它与本案没有直接关系,我们只是不关注它。而这个模式看起来是这样的。

现在我们的代码工作了。在我的版本中,它是这样工作的。
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:)但如果像现在这样将其引入专家顾问,一切都会开始不正确地工作。

据我所知,这是由于这个条目。

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

怎么了?

 
大家好。请回复所有能创建一个在交易开始时增加手数的脚本的人。细节写在个人的。报酬保证在满足任务的情况下
 
IIya:
我们的代码现在可以工作了。在我的版本中,它是这样工作的。

:)只是,如果像现在这样在EA中实施,一切都开始不正确地工作。

因为这个条目,我明白了。

怎么了?

我只是勾画了一个方案,而你的任务是思考进一步的逻辑。

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}