[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 945

 

Merci, mais je n'arrive pas à trouver où se trouve l'erreur...

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

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);
}
 

Bonnes gens, s'il vous plaît, conseillez-moi, j'ai besoin d'un CODE pour mettre en œuvre le TrailingStop !?

Ceux que j'ai trouvés en ligne ne fonctionnent pas (ramper en avant et en arrière).

 
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:

Bonnes gens, s'il vous plaît, conseillez-moi, j'ai besoin d'un CODE pour mettre en œuvre le TrailingStop !?

Ceux que j'ai trouvés en ligne ne fonctionnent pas (ramper en avant et en arrière).

 
rustein:

Merci, mais je n'arrive pas à trouver où se trouve l'erreur...


besoin d'un indicateur complet
 
Vinin:

Besoin d'un indicateur complet

merci

#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);
}
 

Lors de la première exécution, les fonctions ArrayMaximum et ArrayMinimum étaient hors de portée.

#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:

Lors de la première exécution, les fonctions ArrayMaximum et ArrayMinimum étaient hors de portée.

Merci ! !!
 

J'essaie de mettre en place un simple retournement. Lorsqu'une position d'arrêt est atteinte --> ouvrir la position opposée. Je n'arrive pas à ce qu'il ouvre une fois la position opposée et qu'il n'ouvre rien d'autre. Veuillez me conseiller.

 

Je l'ai implémenté de la manière suivante - il s'agit d'une condition - si la position précédente a été fermée avec une perte, alors l'ouverture de la position opposée... Si vous avez besoin d'ouvrir la position opposée exactement quand le stop loss de la position précédente est atteint, alors Kim Igor Vladimirovich sur http://www.kimiv.ru/ a une fonction qui détermine exactement comment l'ordre est fermé exactement par le stop loss. Ainsi, lorsque vous connectez cette fonction, vous devez prescrire la condition si la pose a été fermée lorsque le stop loss a été atteint. Si c'est le cas, vous devez en ouvrir une autre.

PS : Je viens de me rappeler que ce code de fi de clôture pour une pose au stop loss a été posté sur ce fil quelques pages auparavant... Jetez un coup d'œil.

//---Поиск последнего отработавшего ордера для открытия очередной позиции ---
   
   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:

J'essaie de mettre en place un simple retournement. Lorsqu'une position d'arrêt est atteinte --> ouvrir la position opposée. Je n'arrive pas à ce qu'il ouvre une fois la position opposée et qu'il n'ouvre rien d'autre. Veuillez me conseiller.

Que se passe-t-il si au niveau du stop on met simplement l'ordre en attente? Cela ne fonctionnerait-il pas ainsi ?