[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 567

 
Catrock писал(а)>>

另一个来自初学者的问题。

我在我的专家顾问中使用了几个用户定义的函数。我怎样才能使这些函数组合成一个库,并在专家顾问的正文中从那里调用它们。

我对这方面的语言语法并不熟悉。

请参考文档或教程部分。我没有在那里找到它。


https://book.mql4.com/ru/build/structure

https://www.mql5.com/ru/articles/1462

+ 最重要的是...https://book.mql4.com/ru/appendix/examples

 

如何编写一个函数来检查一个头寸是否是或已经 在零条上打开(最好是选择时间框架。OpenPosLastBar(string sym="", int tf=0, int op=-1, int mn=-1),或者说这个函数就是这样。按照我的理解,它只会在此刻开仓,但如果是开仓并已经平仓,则会返回-1。

//+----------------------------------------------------------------------------+
//|返回最后开仓的栏位号或-1。|
//| 参数。|
//| sym - 仪器名称 ( "" - 当前符号 ) |
//| tf - 时间框架 ( 0 - 当前时间框架 ) |
//| op - 操作 ( -1 - 任何位置 ) |
//| mn - 魔术数字 ( -1 - 任何魔术 ) |
//+----------------------------------------------------------------------------+
int NumberOfBarLastPos(string sym="", int tf=0, int op=-1, int mn=-1)
{
datetime oot;
int i, k=OrdersTotal();

if(sym="")
sym=Symbol();
for(i=0; ik; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
{
if(OrderSymbol()==sym)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op0 || OrderType()==op)
{
if(mn0 || OrderMagicNumber()==mn)
{
if(otOrderOpenTime() ) oot=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sym, tf, oot, True));
}
//+----------------------------------------------------------------------------+

 
我们需要两个周期。在第一种情况下,我们通过订单历史,在第二种情况下,我们通过当前的订单。在这两种情况下,如果订单打开的时间大于或等于Time[0],那么该订单是在当前的蜡烛上打开。这对所有的时间框架都是如此。
 
drknn >>:
Нужно два цикла. В первом проходим по истории ордеров, во втором - по текущим ордерам. В обоих случаях если время открытия ордера больше или равно Time[0], то ордер был открыт на текущей свече. Это справедливо для всех таймфреймов.

谢谢你的点击。你能否在代码中要求这样做
 
gince >>:

Спадибо, что аткликнулся. А можно попросить это в коде

下面是一个历史段落的例子

//=========== SchSellHist()  ===============================
//  Функция возвращает количество Sell-ордеров, лежащих в истории сегодняшних торгов
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSellHist(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=Time_D0){// сегодняшний ордер
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}    
             
//==================================================================================================

试着想出你自己的代码,尤其是当你面前有算法和现成的例子时。
[Deleted]  
大家好!请帮助我理解代码,它工作后,很多垃圾被留在图表的箭头圈线上,如何删除它们或让它自己删除,这里是代码的一部分。
[Deleted]  
void seta(string a_name_0, int a_window_8, double a_datetime_12, double a_price_20, int ai_28, color a_color_32, int a_width_36) {
ObjectDelete(a_name_0)。
ObjectCreate(a_name_0,OBJ_ARROW, a_window_8, a_datetime_12, a_price_20) 。
ObjectSet(a_name_0, OBJPROP_ARROWCODE, ai_28)。
ObjectSet(a_name_0, OBJPROP_COLOR, a_color_32)。
ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_36)。
}

void _setabuy(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120)。
seta(g_str_concat_356, 0, TimeCurrent(), Bid + 15.0 * Point, SYMBOL_ARROWUP, Blue, 2) 。
gi_120++;
}

void _setasell(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120)。
seta(g_str_concat_356, 0, TimeCurrent(), Bid - 15.0 * Point, SYMBOL_ARROWDOWN, Red, 2) 。
gi_120++;
}
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

谢谢你。我会试一试的。
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

或者这里有一个函数,可以检查是否在当前条形上开仓(对OrdersTotal()和OrdersHistoryTotal()进行检查)。如果一个类型的订单被打开,返回true。

bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
[Deleted]  

请告诉我如何实现这个条件。

如果(有挂单),就做这个和那个。