KimIV的有用功能 - 页 88

 

Kombat 17.07.2009 22:13

加起来,得到买入-夏季3手,并反击这个量卖出3手

.......................

作为一种选择,是的。不过,如果已经有开放的卖出订单,EA可能关闭的不是你需要的订单。它应该被解决了。

kombat 17.07.2009 22:13.

但要回答你的问题:是否有可能关闭所有头寸?

是的,一个接一个,它是快速脚本,AAP!就这样......

.........................

这就是我现在正在使用的东西。一组脚本--你使用这个和那个...但我试图将我的策略编码到专家顾问中,遇到了一些困难。

 
gince >> :
我有一些东西在这里不起作用,这意味着它没有关闭没有错误。

在ClosePositions()函数中,其b-Positions.mqh库中,KimIV使用了对其另一个ClosePosBySelect()函数的调用,在测试器中禁止使用ee。

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


对于历史测试,使用他的库b-ForTest.mqh

 
BoraBo писал(а)>>

在ClosePositions()函数中,其b-Positions.mqh库中,KimIV使用了对其另一个函数ClosePosBySelect()的调用,这禁止了在测试器中使用ee。

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

对于历史测试,使用他的库b-ForTest.mqh

你误解了我的代码...翻译成俄语...如果它不在测试模式中,并且(EA不允许交易或专家顾问被停止),那么就打破循环。简单地说,当你按下工具栏上的 "Expert Advisors "按钮时,这一行可以确保从循环中退出。

 
抱歉造成了混乱。
 

晚上好。

不幸的是,阵列中也有一个差异......当订单计数时,如果手数大于0(Lts>0),手数会被逐一关闭(当达到利润时),但总利润应被考虑在内。

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

在订单计数的条件下,如果手数超过1(Lts>1),手数就不会被关闭。

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

请告知谁能看到这个错误。

或者说,伊戈尔,我对使用你的函数有误解?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); //调用函数

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  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=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igor,请告诉我如何将你的PriceOpenLastPos函数插入指标中。

编译时,编辑器在第一个括号和随后的变量上给出错误。

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

如果(sy=="0")sy=符号();
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();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}

'(' - 函数定义意外 D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - 变量未定义 D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
等等。

我在一个指标中实现了交易信号形成的逻辑,并通过一个全局变量 将生成的信号发送给专家顾问,以打开/关闭订单。

我需要一个订单的开盘价来做一些决定,所以我正在努力解决这个问题。我的指标是一个动态指标,它只能在演示模式或测试器的可视化模式下进行调试。

 

情况是,考虑的不是总利润,而是单个订单的利润。

 
安吉拉,编译器没有想到会在这个特定的地方找到我的函数定义。这意味着在代码的某个更高的地方,你有一些遗漏。也许是一个分号或一个结尾的大括号。总之,仔细检查代码。
 
hope писал(а)>>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); //函数调用

参数传入函数不正确。它应该是这样的。

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

参数传入函数不正确。它应该是这样的。

在函数调用中为符号添加绑定并没有帮助。为什么它分别计算每个头寸的利润(如上图)?