KimIV的有用功能 - 页 26

 
aceventura:

订单数量的功能将不起作用,因为EA对每一对的设置是不同的。而且它同时在不同的货币对上设置订单。那么,如果对两个交易对下了四个订单,有一个被触发,其中三个被删除,相反的一个应该对所有交易对都被删除。

KimIV的所有功能都会按类型+配对+魔法 "过滤 "订单。即(对我来说!)。:) 不运行和搜索 - 从这个页面 "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)") 通过调用 "Count there some"可以肯定的是,你会得到这个货币对甚至是这个EA的真实未结订单数量。

我指的是函数

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

从第12页开始。

 
SergNF:

KimIV的所有功能都是通过类型+配对+魔法来 "过滤 "订单。即(对我来说!)。:) 不运行和搜索 - 从这个页面 "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)") 通过调用 "Count there some"可以肯定的是,你会得到这个货币对甚至是这个EA的真实未结订单数量。

ZS 我指的是函数

从第12页开始。

谢谢你!非常有帮助!我会研究的。

 
抱歉打扰您了 傻瓜帮助 如何在MT4中快速舒适地绘制平行线?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
请帮助。我做了一个简单的专家顾问,使用拖曳式止损。

如何使追踪止损被放在一次+5点,并没有进一步转移,关闭是由

如果指标已经设置了追踪止损,我如何使用追踪止损?如果你能举出一个例子的话!!。
 
KimIV писал (а)>>

可能不会...我只有两个:食指和握把...>>嘿嘿

伊戈尔,我对你有好感,尽管我不是同性恋。毕竟,你也可以作为扎多诺夫工作。

 

SecondsAfterOpenLastPos()函数。

该函数返回自上一个位置被打开后的秒数。要考虑的位置的选择是由外部参数设定的。

  • sy- 市场工具的名称。如果设置了这个参数,函数将只考虑指定仪器的位置。默认值-"" 意味着任何市场工具。NULL 值表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值为-1,意味着任何标识符。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. 附上一个测试SecondsAfterOpenLastPos()函数的脚本。
附加的文件:
 

我当然非常遗憾,你所做的当然是一件好事。

但你怎么做,我一点也不喜欢。

1.你描述了变量的名称,这很好,但每次你都要在标题中看下一个野生缩写是什么意思,很难理解这个变量代表什么,你会忘记你想在代码中找到的东西。你就不能写一个高质量的自我记录的代码,即使没有注释,懂英语的人也能理解,特别是你是为别人做的,有这种素质的人绝不会发现代码中的错误,如果有的话。



2.重载函数。多样性是一件坏事,一个函数的6个参数太多。



3.代码简单化

例子。

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

这是你的代码。让我们看看你能用它做什么。

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

我们要不要比较一下代码?它做了同样的事情。

1.是的,我的代码比较大,但毕竟我们不是生活在软盘时代,难道空间不够吗?

2.我的代码里面更清晰了。即使没有评论,也会被粘贴在原地。

3.你的函数有嵌套7,我的有2,有区别吗?

4 这是为数不多的没有超载的函数之一,但打开、修改等是一场噩梦。



SZZH: 尊重你要写的人。

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1.不同意。无论在形式上还是内容上,都绝对没问题。请继续采用完全相同 的格式。

是的,我的代码比较大。

正是如此。而且,代码越小,就越容易阅读。我讨厌在2-3个屏幕上 "涂抹 "字体。一个功能应该都在一个屏幕上,不需要翻来覆去。这就是我支持紧凑性的原因。

你的函数有嵌套7,我有2,有区别吗?

你有很多可有可无的连续性,顺便说一下,这又把读者的注意力拉走了,这样做可以吗?

 
Andrei(TheXpert),感谢您的意见和建议!所有这些都是绝对公平的,你的说法是绝对正确的!
 

DeleteOppositeOrders()函数。

该函数删除一个或多个与头寸相反的订单,其类型在操作 中指定。 例如,对于一个买入 头寸,相反的订单将是SellLimitSellStop。例如,如果设置了两个相反的订单,并且其中一个触发了,那么删除相反的订单就成为必要。

  • sy- 市场工具的名称。如果你设置这个参数,函数将只考虑指定符号的位置。默认值"" 意味着任何市场工具。NULL 值表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值为-1,意味着任何标识符。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
附上一个测试DeleteOppositeOrders()函数的脚本。
附加的文件: