[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 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 함수 배열의 오버플로가 있었습니다.

감사해요 !!!
 

단순 쿠데타를 일으키려고 합니다. 정지 위치에 도달하면 --> 반대쪽을 엽니다. 반대쪽이 한 번 열리고 다른 것이 열리지 않도록 만드는 것은 불가능합니다. 제발 내게 말해줘.

 

나는 그것을 다음과 같이 구현했다 - 이 조건은 손실로 이전 포지션을 청산한 다음 반대 포지션을 열 때 ... .kimiv.ru/ 특히 손절매로 정확하게 주문의 청산을 결정하는 기능이 있습니다. 즉, 이 기능을 연결하여 정지 손실에 도달했을 때 위치가 닫혔는지 여부의 조건을 지정하고, 그렇다면 반대 위치를 엽니다...

추신: 손절매로 포지션을 청산하는 기능의 이 코드가 몇 페이지 전에 이 스레드에 제공된 것을 기억합니다... 보세요.

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

단순 쿠데타를 일으키려고 합니다. 정지 위치에 도달하면 --> 반대쪽을 엽니다. 반대쪽이 한 번 열리고 다른 것이 열리지 않도록 만드는 것은 불가능합니다. 제발 내게 말해줘.

스탑 레벨에서 보류 주문 을 넣으면? 그래서 안 어울리나요?