[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 131

 

我重新编写了一段关于我昨天问的问题的代码。现在一切都像它应该的那样。下面是3个函数,以显示用于获得原始信号的内容,因为这只是我所写的开始。

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

这里是购买功能。

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

这里有一句话。

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

我们有一个在ND(fastMa + i_thresholdFromMa * pt) 价格上开的头寸,但根本就没有开。为什么?

我已经挣扎了2天了,我不知道该怎么做。在代码中,所有的东西都是一样的。我还没有写过真正的支票,我现在是为测试员写的。

例如,这里有一张截图。

一个联合

在图表上你可以看到,价格不比fastMa(红色)高,总体上更低。但在代码中,明确规定了挂单应在价格上的条件。

ND(fastMa + i_thresholdFromMa * pt)

专业人士,有什么收获?我不知道该怎么做了......。

 

你好。 在该指标的基础上写了一个指标,原始的信号-信号指标在连接到图表时显示其在所有以前的条上的数值(它适用于所有条,从条[1]开始),但根据它创建的指标(它适用于条[0])只在连接到图表时显示其数值,其数值是正确的,但在以前的条上是 "空的",请你修改它?

我的代码。

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

维克多,我认为你应该在Asc+距离上加一个暂停,在条件中指定Asc和Mashka的比例,然后就会是你想要的结果。试试吧!

 
hoz:


你可以在图表上看到,价格不在fastMa(红色腕带)之上,而是完全低于它。但在代码中,条件明确指出,暂停应该是在价格上。

专业人士,有什么收获?我不知道该怎么做了......。

也许在下订单的时候,MA比现在画的要低。试着不从第0个小节而从第1个小节取MAA值。
 
borilunad:

维克多,我认为你应该在Asc+距离上加一个暂停,在条件中指定Asc和Mashka的比例,然后就会是你想要的结果。试试吧!


鲍里斯,这就是我所做的。

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

而这里是职位空缺。

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

一切似乎都是正确的。但它仍然存在。

塞普尔卡
也许在下订单的时候,MAHA比现在画的要低。试着从第1条而不是第0条中获取MA值。


试了一下,没有区别。我把它放回...对我来说,重要的是在这个时间点上发生了什么,而不是以前发生了什么。

下面是一个截图(如果从机器收到的值不是0,而是1)。

逻辑在哪里?

 

维克多,这就是为什么我一开始就写条件,这样我就能看到一切,所以更容易发现逻辑错误,特别是在还没有足够的知识和经验的时候,在未来很长一段时间内,我都算得上是这样。专业人士很容易操纵函数、文件和库,他们可能已经忘记了自己是如何逐渐掌握这些智慧的。但我们不可能在没有实践的情况下学习理论,而更多的是取决于每个人的性格。

 
hoz:


鲍里斯,这就是我所做的。

而这里是该职位的开幕式。

一切似乎都是正确的。但它仍然存在。


试了一下,没有区别。我把它放回...对我来说,重要的是在这个时间点上发生了什么,而不是之前发生了什么

下面是一个截图(如果从机器收到的值不是0,而是1)。

最后,告诉我你到底想做什么...例如:MAA某某正在上升,并且高于MAA某某,价格高于/低于MAA某某,如果是真的,那么就在这样的距离下一个挂单。我将给你一个粗略的算法。因为当你的代码片段被撕掉时,很难引导你走向正确的方向。而这个问题是针对五年级的(夸张的)。


至于突出显示:在开盘价上下功夫,那么你就不会看到MAC在零点栏上重画了

 
artmedia70:

...很难给你指出正确的方向......

IMHO,不难,但很容易 "指挥 "或发送,因为该同志太热衷于与小袋和货架的斗争,不屑于研究教科书和文件。:-)

 
Roman.:

IMHO,不难,但很容易 "指挥 "或发送,因为该同志太热衷于打击小袋和货架,懒得研究教科书和文件。:-)

男人,几乎没有陷阱......。没有奇迹。
所以一个人用这些石头包围了自己,并移动它们,移动它们。
 
Sepulca:


非常感谢。正是需要的东西)