任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 386

 
alexey1979621:
谢谢,把你的代码拆开了。打开时确实有一个错误(我的眼睛已经湿透了)。我把修改后的EA放到一个演示中,在我们的Meijic上已经有开仓,总的来说是正的利润。然而,该职位并没有关闭。

我看到在新的代码中(在帖子的下面),传递给函数的默认参数已经改变。

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

原始版本有一个不同的Magik。我已经纠正了我的代码中对这个函数的引用。查看哪些Magik订单现在是开放的,并在你的EA中设置这个Magik号码。

P.S. 在命名变量时使用不同的编码并不是一个好的形式的标志...我的意思是。

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


请看这一行

否则,如果(order_type = OP_SELL()

还有这个。

if (order_type = OP_BUY)
 
TarasBY:

我看到在新的代码中(在帖子的下面),传递给函数的默认参数已经改变。

原始版本有一个不同的Magik。我已经纠正了我的代码中对这个函数的引用。看看哪个Magik的订单现在是开放的,并把这个Magik号码放在你的EA中。


不,Magik是正确的,EURAUDUSD的是1111,EURUSD_GBPUSD的是1114(另一个人帮我纠正)。 两次交易都没有成交。我正在观察EURUSD_GBPUSD的总利润,但我的专家顾问无法关闭它。我已经为EURAUD_AUDUSD - 1111修改了你的版本,用于EURUSD_GBPUSD - 1114,它仍然不能关闭交易。猫头鹰的特点是,你不能在测试器中测试(因为有两对交易)--只能在演示器上测试。
 
alexey1979621:

不,法师是正确的,EURAUD_AUDUSD的是1111,EURUSD_GBPUSD的是1114(另一个人帮我纠正)。 两次交易都没有成交。我正在观察EURUSD_GBPUSD的总利润,但我的专家顾问无法关闭它。我已经为EURAUD_AUDUSD - 1111修改了你的版本,为EURUSD_GBPUSD - 1114修改了你的版本,它仍然不能关闭交易。猫头鹰的特点是,你不能在测试器中测试(因为有两对交易)--只能在演示器上测试。


让我们做一些改变。而不是

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
运行EA,将利润设置为零,看看出来的结果和日志中的内容。
 
Roger:


请看这一行

否则,如果(order_type = OP_SELL()


谢谢!)
 
alexey1979621:

不,根据majik,一切都正确,EURAUD_AUDUSD的是1111,EURUSD_GBPUSD的是1114(另一个人帮助解决了这个问题)。 两次交易都没有成交。我正在观察EURUSD_GBPUSD的总利润,但我的专家顾问无法关闭它。我已经为EURAUD_AUDUSD - 1111修改了你的版本,用于EURUSD_GBPUSD - 1114,它仍然不能关闭交易。猫头鹰的特点是,我不能在测试器中测试(因为有两对交易)--只能在演示中测试。

首先,你没有正确解决指标问题。这个指标有很多外部参数。

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

并且在你调用指标时需要列出它们。如果你省略它们,参数将被默认,由于你想将其用于不同的货币对,这个选项并不适合。而其他一切都可以在考虑到EA开始时的参数变化的情况下进行。

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  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) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

在此 阅读有关指标调用的信息。

 
Roger:


让我们做一些改变。而不是

运行EA,将利润设置为零,看看出来的结果和日志中的内容。


其结果是丑陋的。随着你的改变和利润等于0,专家顾问已经关闭了Meijic 1111, 1112, 1113, 1114, 1115的所有头寸。然后,5秒后,这些Meijic符号的新订单被打开,10秒后,它们都被关闭,同样的事情再次发生。仓位不是成对开的,而是混乱的。
 
alexey1979621:

这已经变成了一个可怕的问题。随着你的改变和利润等于0,EA完全关闭了Majic 1111, 1112, 1113, 1114, 1115的所有头寸。然后,5秒后,这些Meijic符号的新订单被打开,10秒后,它们都被关闭,同样的事情再次发生。仓位不是成对开的,而是混乱的。


我的指导性问题是:你在这个账户里有多少个EA?

你有一个条件--在盈利时关闭所有订单。

PS 你已经看到了你这个EA的隐患--它在关闭后会一直开单,最终会导致亏损。所以你必须放一个标志,禁止下新的订单,直到条件过去并再次出现。

 
TarasBY:

首先,你没有正确解决指标的问题。这个指标有很多外部参数。

并且在你调用指标时需要列出它们。如果你省略它们,参数将被默认,由于你想将其用于不同的货币对,这个选项并不适合。其他一切都可以考虑在EA开始时的参数变化来完成。

你可以在这里 阅读关于调用指标的信息。

谢谢你。我知道指标电话的事。但是,当我们在测试或操作中应用指标的可调参数时,应该列出这些参数。 由于这个EA不能在测试器中测试(因为有两个交易对),所以不可能在历史上找到这些参数。你的最后一个变体已经在演示中实现了。 我将看看交易将如何关闭。另一个小问题,对于两个工具的交易,要么在买入,要么在卖出。 如果我们需要一个工具在卖出,另一个在买入,我们应该怎么做?我已经探查过了,没有找到.....。再次,非常感谢你的辛勤工作。
 
Roger:


一个指导性的问题--你在这个账户里有多少个EA?

而且你确实有一个条件--在盈利时关闭所有订单。

PS 你已经看到了你这个EA的隐患--它在关闭后会一直开单,最终会导致亏损。所以你必须放一个标志,禁止下新的订单,直到条件过去并再次出现。


专家顾问为5人工作(双胞胎兄弟--针对不同的交易),当然是用不同的Meijic。


是的,我们有关闭订单的盈利条件,但这些订单与某个EA有关,例如,与MAJIC 1114有关。我从一开始就写了这个问题,并认为猫头鹰在关闭时没有看到自己的订单;事实证明,它看到了所有的订单,并非常希望关闭它们,但我们不需要所有的订单,而是需要一些特定的订单。

如果我们采取H4时期,当指标线 高于0.1和低于-0.1时,条件得到满足,交易被打开,也就是说,有可能在一个信号下获得几个利润(尽管有一个选项是在指标线收敛时关闭交易)。