新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1078

 
Motzaart:

下午。

在一个多货币专家顾问中,我需要在一个未结头寸触发时关闭一个 针对利润的挂单

现在,当我在盈利时关闭一个挂单,所有货币的挂单都被关闭。

如何改变代码,以便只有与货币对有关的挂单关闭,其余的保持开放?

我应该在这段代码中改变什么?

该代码中的Mn是一个挂单BUY_STOP或SELL_STOP的神奇数字。

其逻辑是,当一个未平仓的头寸在获利时被关闭,这个神奇的数字就会被留下,删除它的命令就应该被执行。

这在测试每一对时都是有效的。然而,当与其他货币一起工作时,在所有货币对上的所有订单都被删除。

请帮助,谁能做到这一点。

我明白,没有人应该为这个问题而烦恼,但也许有人有现成的模板?

我将非常感激。

我不得不把代码复制到编辑器中,并做一些正常的样式设计(Ctrl+<),以了解你在那里搞砸了什么。

所以:我在代码中评论了那里被打乱的内容。

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

结果,你的代码是这样做的,也就是说,相当于这个代码。

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

现在问一下--你想从中得到什么?

 
Artyom Trishkin:

为了了解你在那里搞砸了什么,我不得不把代码复制到编辑器中,并进行适当的样式设计(Ctrl+<)。

所以:在代码中评论你在那里搞砸了什么。

结果,你的代码是这样做的,也就是说,等于这个代码。

现在问一下--你想从中得到什么?

好的。

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

这里。

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

当开仓(OP_BUY或OP_SELL)时,我们同时分别下挂单(OP_SELLSTOP和OP_BUYSTOP)。

在获利平仓时,与之对应的挂单必须被取消。这种算法适用于所有货币对。

其他放在其他货币上的挂单应该保留。

 

祝大家今天愉快

有一个指标MTF_RSI正在切换

input ENUM_TIMEFRAMES      TimeFrame   =  0;

你能告诉我是否可以设置在切换图表时自动改变时间框架?

类似的情况

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

祝大家今天愉快

有一个指标MTF_RSI正在切换

你能告诉我是否可以设置在切换图表时自动改变时间框架?

类似这样的事情

创建一个结构或多维数组,让它在所需的维度上运行,如果符合标准,就用一列工作(每一列负责自己的时间框架),如果不符合,就用另一列,就这样。程序本身可以同时访问所有的时间段,所以你写的东西是可能的,但实施起来非常广泛,你在论坛上看不到这个工作量,因为它非常广泛。

 
Seric29:

创建一个结构或多维数组

谢谢你。

 

为什么这段代码不起作用?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

它可以用简单的函数工作,但有一些奇怪的地方。

 
MakarFX:

谢谢你。

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
你在跟我说话吗?
 
MakarFX:
你在跟我说话吗?

对你来说是的。你将不得不在游戏中对每个循环和每个函数中的每个细节进行时间限制的工作。这就是为什么我推荐使用多维 数组。

 
Seric29:

对你来说是的。你将不得不在游戏中对每个循环和每个函数中的每个细节进行时间限制的工作。这就是为什么我推荐使用多维 数组。

这个问题比较容易解决。

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }