[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 66

 
Fox_RM:
下午好!
我在打开一定数量(用户定义的)的订单时遇到了一个问题。
我已经写了一个小代码来解决这个问题。
但有些时候会开出任意数量的订单,通常是在测试接近尾声的时候。

下面是代码本身。

如果你有更简单的解决方案,我很乐意收到评论。


这可能更好。

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
谢谢,但这对我来说有点复杂,你的函数一次输出4条信息,而我需要一条。原来一行中不超过64个字符?

不,你把你的长信息分成你能在屏幕上看到的尽可能多的部分,但不超过四个。最主要的是,每个部分不应超过64个字符。如果你的信息很短,你可以用一个部分把它传递给一个函数。

看,我在预告片中附上了一个提示器来测试这个功能。在测试器中以可视化模式运行,并将Win_Inform指标放在可视化图表中(在我之前的预告片中的信息中)。你会立即看到这个功能是如何工作的。

附加的文件:
 
r772ra:


这可能更好。

这是我用来开始升级我的代码。你的版本有3个问题。

- 只要OP_BUY和 OP_SELL 订单被打开 OrdB和 OrdS 参数就会在每个tick 上自动增加,所以我只在相应的tick(卖出或买入)变化时添加了重新计算条件

- 所有订单的重新计算会导致OrdB和 Ord 的错误,我们只需要考虑订单的最后一次变化

- 在你的版本中, 如果 (OrdB<=OrederBuy),如果(OrdS<=OrederSell),没有减少 参数OrdB和 Ord来进一步开仓

情况似乎是这样的。

 
Fox_RM:

我开始升级我的大约这个代码。你的版本有3个问题。

- 只要OP_BUY和 OP_SELL 订单被打开 OrdB和 OrdS 参数就会在每个tick上自动增加,所以我只在相应的tick(卖出或买入)变化时添加了重新计算条件

- 所有订单的重新计算会导致OrdB和 Ord 的错误,我们只需要考虑订单的最后一次变化

- 在你的版本中, 如果 (OrdB<=OrederBuy),如果(OrdS<=OrederSell),没有减少 参数OrdB和 Ord来进一步开仓

似乎是这样的。

没错,我们需要在for循环之前将订单的计数器清零。

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

下午好!请帮助我理解金的功能。

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

我不明白这句话

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

为什么在第一个if后面没有标志,当表达式被写成这样时会发生什么?StringFind 是做什么的,为什么要用JPY来搜索字符串?d=0,在哪种情况下分配2,在哪种情况下分配4,怎么可能?我将非常感谢您的回答,提前感谢)))。

 
r772ra:

这就对了,在for循环之前,我们需要将订单计数器重置为零

))由于某些原因,我自己没有想到这一点,于是开始摸索。
 
Fox_RM:
))不知为什么,我自己没有想到,开始上气不接下气。

摆脱困境的好办法。
 
Lisi4ka330: 为什么在第一个if后面没有标志,如果表达式是这样写的会怎样?d=0,在哪种情况下分配2,在哪种情况下分配4,怎么可能?如果能得到答案,我将非常感激,提前感谢))))。

我认为这更有意义

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - 报价精度(小数点后的数字)。

如果有一个日元对,那么主要货币的汇率是xxx.xx。

如果货币对中没有日元,那么主要货币的汇率将是x.xxxx(因此被称为"四位数")。

 
r772ra:

是的,在for循环之前,我们需要将订单计数器重置为零。


我还忽略了另一点。

- 在你的版本中, 如果 (OrdB<=OrederBuy),如果(OrdS<=OrederSell),没有减少 参数OrdB和 OrdS 以便进一步开立 订单。

在新版本中,例如,我们已经开了5个订单,重新计算了它们,但是if条件不会让我们再开任何订单。在我的旧变体中,OrdB--和 OrdS--

被使用。

 
GaryKa:

我认为这更有意义

d - 报价精度(小数点后的数字)。

如果有一个日元对,那么主要货币的汇率是xxx.xx。

如果货币对中没有日元,那么主要货币的汇率约为x.xxxx(因此称为 "四位数")。

GaryKa,谢谢你的回答,有点不清楚d怎么可能是0,因为函数
 d=MarketInfo(sy, MODE_DIGITS)
返回小数点后的数字,所以d总是大于0,条件总是假的。