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

 
rigonich:

你在Trade()函数中没有选择一个订单。

顺便说一下。在Trade() 函数中选择一个订单的意义是什么?我正在调用 OrdersModifying() 函数,其中订单被选中并在那里被修改。也就是说,最初的变体是正确的!
[Deleted]  
hoz:


有了这个。这里是修复。

而修改功能就在这里。

奇怪的是,在输出上又没有任何停顿和取舍。



OrderSelect(g_ticket,SELECT_BY_TICKET)在行前 if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
[Deleted]  
TUNGUS:


History, History_Draw - 它们在测试期间像专家顾问一样工作。

你需要像这样的东西来观察历史上按给定参数进行的修正


在历史上还是在图表上?如果是,那么你想在图表窗口中看到什么样的数据,在一个单独的窗口中,打印成表格, 不同颜色的蜡烛的形式,或以连接运动开始和结束的线?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET)在行前 if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


这就是我所做的。

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

没有停止和接管的情况。日志上写着错误130,说止损点是错误的。我看不出有什么原因。

[Deleted]  
hoz:


这就是我所做的。

没有停止和接管的情况。日志说错误130,说是止损点不对。我看不出有什么原因。


没有ifs,只要OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);,你就可以把它留在OrdersModifying()里。

//+------------------------------------------------------------------+

空白的订单修改()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES)。

如果(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // If stop loss input parameter is not 0

// 获取所选订单 的止损值。

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // 如果TakeProfit输入参数不等于0,那么。

//获得所选订单的TakeProfit值

}

如果(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // 如果停止损失的输入参数不是0

// 获取所选订单的止损值。

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // 如果TakeProfit输入参数不等于0,那么。

//获得所选订单的TakeProfit值

}

如果(sl != 0 || tp !)= 0)// 如果得到的sl和tp的值不等于0,那么。.

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // 修改订单。

}

}


[Deleted]  
anton.veksler:

MT4的Symbol()问题。

2个功能来说明。

执行第一个命令会输出一个空字符串。

但第二个函数输出一个字符串ID "EURUSD"(嗯,取决于图表,但输出,尽管根据函数的逻辑,它应该是一个空字符串)。

帮助我了解什么是错的?谢谢你


在声明你的变量时,你不能使用保留的名称(value),要调用_value
 
hoz:


这就是我所做的。

没有停止和接管的情况。日志上写着错误130,说止损点是错误的。我看不出有什么原因。

他们也不会这样做!

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

维塔利,我按你说的做了,但没有任何变化。显然,这个错误被埋在其他地方。

之前我拥有一切(开仓订单--当达到设定的价格水平时,修改并转移到b.w.),一切都在运作。它是这样的。

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

现在,当我把一切都分解成具体的专门功能时,一切都停止了工作,太多。我两种方法都试过了,没有任何效果。 停顿没有设置。

 
borilunad:

他们也不会这样做!

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

这里面的逻辑是什么?我想了解...这里有一个函数。

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

如果输入变量i_sli_tp 不等于零,我们就会得到已经在订单中的停止和取货价格--sltp。之后,我将检查我们是否在这里 计算了sltp (如果是短线)

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

如果获得了这些值,那么它们就不可能是零......因为它们会被改变!这些是我们按代码上下文依次得到的变量。

在这里,我检查了我们是否找到了停止和获取的价值。在所有的条件下,它们怎么可能是零?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

首先在开始时建立你的逻辑,然后做函数、文件等。

为什么要把你的左手抓到右耳后面!?