[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 945

 

谢谢,但无法找出错误所在......

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

int start()
{
   int  counted_bars=IndicatorCounted();
   int  i,limit;

   if(counted_bars < 0) return(-1);
   if(counted_bars > 0) counted_bars--;
           limit = Bars-counted_bars;

   //
   
   for(i=limit; i>=0; i--)
   {  
      Prices[i] = iMA(NULL,0,1,0,MODE_SMA,PriceType,i);
            
         double MaxH = Prices[ArrayMaximum(Prices,period,i)];
         double MinL = Prices[ArrayMinimum(Prices,period,i)];
         if (MaxH!=MinL)
               Values[i] = 0.33*2*((Prices[i]-MinL)/(MaxH-MinL)-0.5)+0.67*Values[i+1];
         else  Values[i] = 0.00;
               Values[i] = MathMin(MathMax(Values[i],-0.999),0.999); 
               buffer5[i] = 0.5*MathLog((1+Values[i])/(1-Values[i]))+0.5*buffer5[i+1];

         if(buffer5[i]==buffer5[i+1])
            {
               buffer1[i]=buffer1[i+1];
               buffer2[i]=buffer2[i+1];
               buffer3[i]=buffer3[i+1];
               buffer4[i]=buffer4[i+1];
               continue;
            }
      
            buffer1[i]=EMPTY_VALUE;
            buffer2[i]=EMPTY_VALUE;
            buffer3[i]=EMPTY_VALUE;
            buffer4[i]=EMPTY_VALUE;
            if(buffer5[i]<0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer3[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer4[i]=buffer5[i];
               }
            if(buffer5[i]>0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer2[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer1[i]=buffer5[i];
               }
   }
   return(0);
}
 

好心人,请告诉我,我需要一个代码来实现TrailingStop!?

我在网上找到的那些东西不起作用(向前和向后爬)。

 
void TrailPositions()
{
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++)
  {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
    {    
      if (OrderType() == OP_BUY)  
      {
        if (Bid-OrderOpenPrice() > MinProfit*Point) 
        {
          if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point) 
          {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point,OrderTakeProfit(), 0, 0);
            if(UseSound == true)
            {
            PlaySound(SuccesSound);
            }           
          }
        }
      }   
      if (OrderType() == OP_SELL)  
      {
        if (OrderOpenPrice()-Ask > MinProfit*Point) 
        {
          if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point) 
          {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point,OrderTakeProfit(), 0, 0);
            if(UseSound == true)
            {
            PlaySound(SuccesSound);
            }           
          }
        }
      }   
    }   
  }  
}
//+------------------------------------------------------------------+
sergeyka2003:

好心人,请告诉我,我需要一个代码来实现TrailingStop!?

我在网上找到的那些东西不起作用(向前和向后爬)。

 
rustein:

谢谢你,但我搞不清楚错误在哪里......


需要一个完整的指标
 
Vinin:

需要一个完整的指标

谢谢

#property  indicator_separate_window
#property  indicator_buffers 5
#property  indicator_color1  Green
#property  indicator_color2  Red
#property  indicator_color3  Red
#property  indicator_color4  Green
#property  indicator_color5  DimGray
#property  indicator_width1  2
#property  indicator_width3  2
#property  indicator_width5  0

//
 
extern int  period = 21;
int  PriceType = PRICE_MEDIAN;

double buffer1[];
double buffer2[];
double buffer3[];
double buffer4[];
double buffer5[];
double Prices[];
double Values[];

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

int init()
{
   IndicatorBuffers(7);
      SetIndexBuffer(0,buffer1); SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexBuffer(1,buffer2); SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexBuffer(2,buffer3); SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexBuffer(3,buffer4); SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexBuffer(4,buffer5);
      SetIndexBuffer(5,Prices);
      SetIndexBuffer(6,Values);
   IndicatorShortName("Fisher ("+period+")");
   return(0);
}

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

int start()
{
   int  counted_bars=IndicatorCounted();
   int  i,limit;

   if(counted_bars < 0) return(-1);
   if(counted_bars > 0) counted_bars--;
           limit = Bars-counted_bars;

   //
   
   for(i=limit; i>=0; i--)
   {  
      Prices[i] = iMA(NULL,0,1,0,MODE_SMA,PriceType,i);
            
         double MaxH = Prices[ArrayMaximum(Prices,period,i)];
         double MinL = Prices[ArrayMinimum(Prices,period,i)];
         if (MaxH!=MinL)
               Values[i] = 0.33*2*((Prices[i]-MinL)/(MaxH-MinL)-0.5)+0.67*Values[i+1];
         else  Values[i] = 0.00;
               Values[i] = MathMin(MathMax(Values[i],-0.999),0.999); 
               buffer5[i] = 0.5*MathLog((1+Values[i])/(1-Values[i]))+0.5*buffer5[i+1];

         if(buffer5[i]==buffer5[i+1])
            {
               buffer1[i]=buffer1[i+1];
               buffer2[i]=buffer2[i+1];
               buffer3[i]=buffer3[i+1];
               buffer4[i]=buffer4[i+1];
               continue;
            }
      
            buffer1[i]=EMPTY_VALUE;
            buffer2[i]=EMPTY_VALUE;
            buffer3[i]=EMPTY_VALUE;
            buffer4[i]=EMPTY_VALUE;
            if(buffer5[i]<0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer3[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer4[i]=buffer5[i];
               }
            if(buffer5[i]>0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer2[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer1[i]=buffer5[i];
               }
   }
   return(0);
}
 

在第一次运行时,ArrayMaximum 和ArrayMinimum函数 超出了范围

#property  indicator_separate_window
#property  indicator_buffers 5
#property  indicator_color1  Green
#property  indicator_color2  Red
#property  indicator_color3  Red
#property  indicator_color4  Green
#property  indicator_color5  DimGray
#property  indicator_width1  2
#property  indicator_width3  2
#property  indicator_width5  0

//

extern int  period = 21;
int  PriceType = PRICE_MEDIAN;

double buffer1[];
double buffer2[];
double buffer3[];
double buffer4[];
double buffer5[];
double Prices[];
double Values[];

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

int init()
{
   IndicatorBuffers(7);
      SetIndexBuffer(0,buffer1); SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexBuffer(1,buffer2); SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexBuffer(2,buffer3); SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexBuffer(3,buffer4); SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexBuffer(4,buffer5);
      SetIndexBuffer(5,Prices);
      SetIndexBuffer(6,Values);
   IndicatorShortName("Fisher ("+period+")");
   return(0);
}

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

int start()
{
   int  counted_bars=IndicatorCounted();
   int  i,limit=Bars-counted_bars;

   if(limit > 1) 
      limit = Bars-period-1;


   
   for(i=limit; i>=0; i--)
   {  
      Prices[i] = iMA(NULL,0,1,0,MODE_SMA,PriceType,i);
            
         double MaxH = Prices[ArrayMaximum(Prices,period,i)];
         double MinL = Prices[ArrayMinimum(Prices,period,i)];
         if (MaxH!=MinL)
               Values[i] = 0.33*2*((Prices[i]-MinL)/(MaxH-MinL)-0.5)+0.67*Values[i+1];
         else  Values[i] = 0.00;
               Values[i] = MathMin(MathMax(Values[i],-0.999),0.999); 
               buffer5[i] = 0.5*MathLog((1+Values[i])/(1-Values[i]))+0.5*buffer5[i+1];

         if(buffer5[i]==buffer5[i+1])
            {
               buffer1[i]=buffer1[i+1];
               buffer2[i]=buffer2[i+1];
               buffer3[i]=buffer3[i+1];
               buffer4[i]=buffer4[i+1];
               continue;
            }
      
            buffer1[i]=EMPTY_VALUE;
            buffer2[i]=EMPTY_VALUE;
            buffer3[i]=EMPTY_VALUE;
            buffer4[i]=EMPTY_VALUE;
            if(buffer5[i]<0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer3[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer4[i]=buffer5[i];
               }
            if(buffer5[i]>0)
               {
                  if (buffer5[i]<buffer5[i+1]) buffer2[i]=buffer5[i];
                  if (buffer5[i]>buffer5[i+1]) buffer1[i]=buffer5[i];
               }
   }
   return(0);
}
 
Vinin:

在第一次运行时,ArrayMaximum和ArrayMinimum函数超出了范围

谢谢!!!
 

试图实施一个简单的逆转。当达到一个停止位置时 --> 打开相反的位置。我不能让它 打开对面的位置,而不打开其他任何东西。请告知。

 

我以如下方式实现了它--这是一个条件--如果前一个头寸以亏损收盘,那么就打开相反的头寸...如果你需要在达到前一个仓位的止损时准确地打开相反的仓位,那么金-伊戈尔-弗拉基米罗维奇在http://www.kimiv.ru/,该功能可以准确地确定如何在止损点关闭订单。因此,当你连接这个函数时,你应该规定条件,如果姿势在达到止损时被关闭。 如果是,你应该打开另一个。

PS: 刚想起来,这个在止损处摆出的收盘fi代码在之前的几页中被贴在这个主题上...看看吧。

//---Поиск последнего отработавшего ордера для открытия очередной позиции ---
   
   for (orderIndex = (OrdersHistoryTotal() - 1); orderIndex >= 0; orderIndex--)
   {   
      if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY))
      {
         Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
         continue;
      }
   
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }
      
        
   //-------------------------Принимаем в расчет только ордер, закрытый недавно-----------------------
         
      if (OrderCloseTime() >= iTime(NULL, 0, 1))
      {
         int lastType = OrderType();
         double lastLots = OrderLots();
         double lastProfit = OrderProfit() + OrderSwap();
         
        // Print ("lastProfit = ", NormalizeDouble(lastProfit, 1));
         
       
         
         // Анализ только что закрывшегося ордера
      
         if (lastProfit < 0.0)
         {
  //---Ордер закрылся с убытком открываемся в ОБРАТНОМ направлении
                           
           
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
    
  // -----если предыдущий ордер был бай, то открываем очередной ордер   
            lots = NormalizeLots(lots);
            if (lastType == OP_SELL)  OrderSend(Symbol(), OP_BUY, lots,...);
                          
            if (lastType == OP_BUY)   OrderSend(Symbol(), OP_SELL, lots, ...);
          }           
        
         
         return (0);
       }
      
      // Найден закрытый ордер, но он старый
      
      break;
   }
 
001:

试图实施一个简单的逆转。当达到一个停止位置时 --> 打开相反的位置。我不能让它 打开对面的位置,而不打开其他任何东西。请告知。

如果在止损水平上简单地放置挂单 怎么办?这样就不会有问题了吗?
原因: