[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 485

 
SL의 경우 어드바이저는 동일한 유형의 주문을 열고 TP의 경우 반대 주문을 열어야 합니다!
그러나 어떤 이유로 고문은 종종 잘못된 유형의 주문을 엽니 다!



 //+------------------------------------------------------------------+
//|                                                      Kogalym.mq4 |
//|                                                               TO |
//|                             http://forex-tradexperts-to.narod.ru |
//+------------------------------------------------------------------+
#property copyright "TO"
#property link      "http://forex-tradexperts-to.narod.ru"

//--------------------------------------------------------------------
extern int  stoploss    = 50 ,
            takeprofit  = 50 ;
extern double      Lot= 1 ;
extern double Martin_Koef = 1.6 ;
//--------------------------------------------------------------------
int init()
{
   OrderSend ( Symbol (),OP_SELL,Lot,Bid, 3 , NormalizeDouble (Ask + stoploss* Point , Digits ),
                        NormalizeDouble (Bid - takeprofit* Point , Digits ), " " , 777 , Blue );
}
//--------------------------------------------------------------------
int start()
{   for ( int i= 0 ; i< OrdersTotal (); i++){   
      if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)==true){
         if (OrderSymbol()== Symbol ()){
         Lot = OrderLots(); return ;}}}
            if (Lot== 0 ) return ;
       
  if (OrderType() == OP_SELL)
   if (OrderProfit()> 0 ) OrderSend ( Symbol (),OP_BUY , getLot(),Ask, 3 , NormalizeDouble (Bid - stoploss* Point , Digits ),
                                    NormalizeDouble (Ask + takeprofit* Point , Digits ), " " , 777 , Blue ); 
 else  OrderSend ( Symbol (),OP_SELL,getLot(),Bid, 3 , NormalizeDouble (Ask + stoploss* Point , Digits ),
                                   NormalizeDouble (Bid - takeprofit* Point , Digits ), " " , 777 , Blue );

  if (OrderType() == OP_BUY) 
   if (OrderProfit()> 0 ) OrderSend ( Symbol (),OP_SELL,getLot(),Bid, 3 , NormalizeDouble (Ask + stoploss* Point , Digits ),
        NormalizeDouble (Bid - takeprofit* Point , Digits ), " " , 777 , Blue );
else  OrderSend ( Symbol (),OP_BUY ,getLot(),Ask, 3 , NormalizeDouble (Bid - stoploss* Point , Digits ),
                                    NormalizeDouble (Ask + takeprofit* Point , Digits ), " " , 777 , Blue );
  
                                     
       
   return ( 0 );
}
//-----------------------------------------------------------------

double getLot()
{
   if (OrdersHistoryTotal()== 0 ) return ( 1 );
   // ищем самый последний закрытый ордер
   datetime time= 0 ;
   int i;
   int ticket=- 1 ;
   for (i=OrdersHistoryTotal()- 1 ;i>= 0 ;i--)
   {
      if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol()== Symbol ())
         {
            if (OrderCloseTime()>time)
            {
               time=OrderCloseTime();
               ticket=OrderTicket();
            }
         }
      }
   }
   if (OrderTicket()!=ticket) OrderSelect (ticket,SELECT_BY_TICKET);
   if (OrderProfit()<= 0 ) return ( NormalizeDouble (OrderLots()*Martin_Koef, 2 ));
   if (OrderProfit()> 0 ) return ( 1 );
   //-----
}
어디가 잘못되었는지 알려주세요???
 
Kogalym писал(а) >>
SL의 경우 어드바이저는 동일한 유형의 주문을 열고 TP의 경우 반대 주문을 열어야 합니다!
그러나 어떤 이유로 고문은 종종 잘못된 유형의 주문을 엽니 다!



어디가 잘못되었는지 알려주세요???

 if (OrderType() == OP_SELL)
   if (OrderProfit()> 0 )
이것은 선택이 필요합니다.
 
이 지표가 어드바이저에게 적합한지 아는 사람, 저자가 사용하는 전략 하나를 찾았거나 어드바이저에 등록하고 수행하는 방법, 예를 들어 예시로 보여줄 수 있습니다. 히스토그램이 녹색이고 선이 히스토그램 아래에 있으면 매수 신호입니까? 세포의 경우에도 마찬가지입니다.
 
PapaYozh >> :


배열 x10의 차원은 무엇입니까?

십?
그런 다음 다음과 같이 다시 작성해야 합니다.

MAX 및 MIN 배열에서 정확히 무엇을 얻고 싶은지 명확하지 않습니다.

다시 설명드리겠습니다 :)

MACD 열의 모든 값을 포함하는 배열이 있습니다.

그 모든 값에서 10개의 값을 (순서대로) 가져와서 최대값을 찾고 그에 따라 칠면조로 그리는 식으로 끝까지 계속해야 합니다.

다음은 다시 코드입니다.

 for (i= 0 ; i< 50 ; i=i+ 10 ) //общий цикл для всех значений МАКД, шаг 10
       {
         int k = i;
         for (k=i; k<i+ 10 ; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[k]; // массив десяток
             }
         int IndexMAX = ArrayMaximum (x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum (x10); // --//--   
         MAX[k] = MACD[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = MACD[IndexMIN];
       }

내가 알기로는 수십 개의 배열 인덱스가 MACD 값이 있는 기본 배열의 이 값 인덱스와 일치하지 않기 때문에 그려지지 않습니다.

저것들. 메인 루프의 카운터가 30에 도달하면 30-31-32...39가 중첩 루프로 이동합니다(최대값이 34라고 가정). Arraymaximum(x10) 함수는 다음을 찾습니다. 그러나 정확히 서수를 사용자(x10) 배열의 IndexMAX에 씁니다. 실제로 값 34는 true이고 다른 값(0에서 9까지, 이것은 10의 배열이기 때문에)을 씁니다. 어떻게 해야할지 생각이 안나네요...

 
Noterday писал(а) >>

다시 설명드리겠습니다 :)

MACD 열의 모든 값을 포함하는 배열이 있습니다.

그 모든 값에서 10개의 값을 (순서대로) 가져와서 최대값을 찾고 그에 따라 칠면조로 그리는 식으로 끝까지 계속해야 합니다.

다음은 다시 코드입니다.

제가 알기로는 10개의 배열 인덱스가 MACD 값이 있는 메인 배열에서 이 값의 인덱스와 일치하지 않기 때문에 그려지지 않습니다.

저것들. 메인 루프의 카운터가 30에 도달하면 30-31-32...39가 중첩 루프로 이동합니다(최대값이 34라고 가정). Arraymaximum(x10) 함수는 다음을 찾습니다. 그러나 정확히 서수를 사용자(x10) 배열의 IndexMAX에 씁니다. 사실, 값 34는 true이고 다른 값을 씁니다(0에서 9까지, 이것은 10의 배열이기 때문에). 어떻게 해야할지 생각이 안나네요...


표시기의 전체 코드 표시
 
Vinin >> :


표시기의 전체 코드 표시
 //+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                                        Alexander |
//+------------------------------------------------------------------+
#property  copyright "none"
#property  link       "none"
//---- indicator settings
#property  indicator_separate_window
#property indicator_buffers 4

#property indicator_color1 MediumPurple
#property indicator_color2 MediumPurple
#property indicator_color3 Green
#property indicator_color4 Red

#property indicator_width1 1
#property indicator_width2 1

//---- indicator parameters
extern int FastEMA= 12 ;
extern int SlowEMA= 26 ;
extern int SignalSMA= 9 ;
//---- indicator buffers
double      MACD[];
double      SMACD[];
double      MAX[];
double      MIN[];
double      x10[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 5 );
   
   SetIndexBuffer ( 0 ,MACD);
   SetIndexBuffer ( 1 ,SMACD);
   SetIndexBuffer ( 2 ,MAX);
   SetIndexBuffer ( 3 ,MIN);
   SetIndexBuffer ( 4 ,x10);
   
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexStyle( 1 , DRAW_LINE );
   
   SetIndexStyle( 2 , DRAW_ARROW );
   SetIndexArrow( 2 , 119 );
   
   SetIndexStyle( 3 , DRAW_ARROW );
   SetIndexArrow( 3 , 119 );
   
   SetIndexStyle( 4 , DRAW_NONE );
   
   SetIndexDrawBegin( 1 ,SMACD);
   IndicatorDigits( Digits + 2 );

   IndicatorShortName( "MACD(" +FastEMA+ "," +SlowEMA+ "," +SignalSMA+ ")" );
   SetIndexLabel( 0 , "MACD" );
   SetIndexLabel( 1 , "Signal" );

   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();

   if (counted_bars> 0 ) counted_bars--;
   limit= Bars -counted_bars;

   for ( int i= 0 ; i<limit; i++)
      MACD[i]= iMA ( NULL , 0 ,FastEMA, 0 , MODE_EMA , PRICE_CLOSE ,i)- iMA ( NULL , 0 ,SlowEMA, 0 , MODE_EMA , PRICE_CLOSE ,i);

   for (i= 0 ; i<limit; i++)
      SMACD[i]=iMAOnArray(MACD, Bars ,SignalSMA, 0 , MODE_SMA ,i);
      
      
   for (i= 0 ; i<limit; i=i+ 10 )
       {
         int k = i;
         for (k=i; k<i+ 10 ; k++)
             {       
              x10[k] = MACD[k]; // массив десяток
             }
         int IndexMAX = ArrayMaximum (x10);
         int IndexMIN = ArrayMinimum (x10);    
         MAX[k] = MACD[IndexMAX];
         MIN[k] = MACD[IndexMIN];
       }
   return ( 0 );
  }
//+------------------------------------------------------------------+

int deinit()
{   
return ( 0 );
}
 
Noterday писал(а) >>

다시 설명드리겠습니다 :)

나는 당신이 다음과 같이 작성하려고 생각했다고 생각합니다.

 for (i= 0 ; i<limit; i+= 10 ) //общий цикл для всех значений МАКД, шаг 10
       {
         int k;
         for (k=0; k< 10 ; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[i+k]; // массив десяток
             }
         int IndexMAX = ArrayMaximum (x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum (x10); // --//--   
         MAX[k] = x10[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = x10[IndexMIN];
       }
 
Noterday писал(а) >>


그리고 당신의 목표는 무엇입니까?
글쎄, 당신은 무엇을 얻고 싶어. 수십 개로 나누는 것은 무의미합니다. 그들은 시간 속에서 끊임없이 움직입니다.

 
PapaYozh >> :

나는 당신이 다음과 같이 작성하려고 생각했다고 생각합니다.

그릴 수 없습니다 :((

추신 k=0 추가했습니다 :)

 
Vinin >> :


그리고 당신의 목표는 무엇입니까?
글쎄, 당신은 무엇을 얻고 싶어. 수십 개로 나누는 것은 무의미합니다. 그들은 시간 속에서 끊임없이 움직입니다.

네, 목표는 말 그대로... 10개 막대마다 최대값을 표시하고 싶습니다...