[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 3. - 페이지 280

 
sergeev :

iMA는 어떻게 계산됩니까?



90

iMA 기능이 어떻게 계산되는지 찾을 수 있는 곳(또는 분류되어 있는지)

저는 특히 MODE_LWMA에 관심이 있습니다.

내 취향에 맞게 보고 수정하고 싶지만 소스 코드를 구글링하기에는 뭔가 잘 되지 않는다.

https://docs.mql4.com/en/indicators/iMA

이중 iMA ( string symbol, int timeframe, int period, int ma_shift, int ma_method, int apply_price, int shift)
이동 평균 계산.
공식이 필요하므로 Google에서도 쉽게 찾을 수 있습니다.
 
snail09 :

https://docs.mql4.com/en/indicators/iMA

이중 iMA ( string symbol, int timeframe, int period, int ma_shift, int ma_method, int apply_price, int shift)
이동 평균 계산.
공식이 필요하므로 Google에서도 쉽게 찾을 수 있습니다.
아니면 "선형 가중"이라는 용어를 이해하지 못하셨습니까?

 

iMA 기능이 어떻게 계산되는지 찾을 수 있는 곳(또는 분류되어 있는지)

저는 특히 MODE_LWMA에 관심이 있습니다.

내 취향에 맞게 보고 수정하고 싶지만 소스 코드를 구글링하기에는 뭔가 잘 되지 않는다.


 //+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period= 13 ;
extern int MA_Shift= 0 ;
extern int MA_Method= 0 ;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int     draw_begin;
   string short_name;
//---- drawing settings
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexShift ( 0 ,MA_Shift);
   IndicatorDigits ( MarketInfo ( Symbol (),MODE_DIGITS));
   if (MA_Period< 2 ) MA_Period= 13 ;
   draw_begin=MA_Period- 1 ;
//---- indicator short name
   switch (MA_Method)
     {
       case 1 : short_name= "EMA(" ;  draw_begin= 0 ; break ;
       case 2 : short_name= "SMMA(" ; break ;
       case 3 : short_name= "LWMA(" ; break ;
       default :
         MA_Method= 0 ;
         short_name= "SMA(" ;
     }
   IndicatorShortName (short_name+MA_Period+ ")" );
   SetIndexDrawBegin ( 0 ,draw_begin);
//---- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtMapBuffer);
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if ( Bars <=MA_Period) return ( 0 );
   ExtCountedBars= IndicatorCounted ();
//---- check for possible errors
   if (ExtCountedBars< 0 ) return (- 1 );
//---- last counted bar will be recounted
   if (ExtCountedBars> 0 ) ExtCountedBars--;
//----
   switch (MA_Method)
     {
       case 0 : sma();   break ;
       case 1 : ema();   break ;
       case 2 : smma(); break ;
       case 3 : lwma();
     }
//---- done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
void sma()
  {
   double sum= 0 ;
   int     i,pos= Bars -ExtCountedBars- 1 ;
//---- initial accumulation
   if (pos<MA_Period) pos=MA_Period;
   for (i= 1 ;i<MA_Period;i++,pos--)
      sum+=Close[pos];
//---- main calculation loop
   while (pos>= 0 )
     {
      sum+=Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
           sum-=Close[pos+MA_Period- 1 ];
           pos--;
     }
//---- zero initial bars
   if (ExtCountedBars< 1 )
       for (i= 1 ;i<MA_Period;i++) ExtMapBuffer[ Bars -i]= 0 ;
  }
//+------------------------------------------------------------------+
//| Exponential Moving Average                                       |
//+------------------------------------------------------------------+
void ema()
  {
   double pr= 2.0 /(MA_Period+ 1 );
   int     pos= Bars - 2 ;
   if (ExtCountedBars> 2 ) pos= Bars -ExtCountedBars- 1 ;
//---- main calculation loop
   while (pos>= 0 )
     {
       if (pos== Bars - 2 ) ExtMapBuffer[pos+ 1 ]=Close[pos+ 1 ];
      ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+ 1 ]*( 1 -pr);
           pos--;
     }
  }
//+------------------------------------------------------------------+
//| Smoothed Moving Average                                          |
//+------------------------------------------------------------------+
void smma()
  {
   double sum= 0 ;
   int     i,k,pos= Bars -ExtCountedBars+ 1 ;
//---- main calculation loop
   pos= Bars -MA_Period;
   if (pos> Bars -ExtCountedBars) pos= Bars -ExtCountedBars;
   while (pos>= 0 )
     {
       if (pos== Bars -MA_Period)
        {
         //---- initial accumulation
         for (i= 0 ,k=pos;i<MA_Period;i++,k++)
           {
            sum+=Close[k];
             //---- zero initial bars
            ExtMapBuffer[k]= 0 ;
           }
        }
       else sum=ExtMapBuffer[pos+ 1 ]*(MA_Period- 1 )+Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
           pos--;
     }
  }
//+------------------------------------------------------------------+
//| Linear Weighted Moving Average                                   |
//+------------------------------------------------------------------+
void lwma()
  {
   double sum= 0.0 ,lsum= 0.0 ;
   double price;
   int     i,weight= 0 ,pos= Bars -ExtCountedBars- 1 ;
//---- initial accumulation
   if (pos<MA_Period) pos=MA_Period;
   for (i= 1 ;i<=MA_Period;i++,pos--)
     {
      price=Close[pos];
      sum+=price*i;
      lsum+=price;
      weight+=i;
     }
//---- main calculation loop
   pos++;
   i=pos+MA_Period;
   while (pos>= 0 )
     {
      ExtMapBuffer[pos]=sum/weight;
       if (pos== 0 ) break ;
      pos--;
      i--;
      price=Close[pos];
      sum=sum-lsum+price*MA_Period;
      lsum-=Close[i];
      lsum+=price;
     }
//---- zero initial bars
   if (ExtCountedBars< 1 )
       for (i= 1 ;i<MA_Period;i++) ExtMapBuffer[ Bars -i]= 0 ;
  }
//+------------------------------------------------------------------+
 

안녕하세요!

첫 번째 실험으로 저는 다음 알고리즘을 구현하기로 결정했습니다. 볼린저 밴드가 좁은 통로로 수렴한 후 얼마 후 시장이 위 또는 아래로 급격한 움직임이 있을 것으로 예상할 수 있습니다. Expert Advisor에서 나는 볼린저 밴드의 상태를 분석하고, 볼린저 밴드가 닫힐 때( 델타 포인트 ), 시장이 희망을 갖고 하향 방향(바닥 라인 아래의 스텝오픈 포인트)으로 매도하기 위해 보류 주문을 넣습니다. 이 방향으로 급격히 움직일 것입니다. 시장이 다른 방향으로 갔다면 이 주문을 삭제하기만 하면 됩니다.

 extern double Delta= 800.0 ;               // Ширина канала, которую мы считаем достаточно узкой чтобы ожидать скоро серьезного движения в одну из сторон
extern double StepOpen= 150.0 ;           // Отступ от линии Боллинджера  для открытия отложенного ордера
extern double TP= 350.0 ;                 // Take Profit
extern double SL= 400.0 ;                 // Stop Loss

int start()
  {
   double T1= iBands ( NULL , 0 , 20 , 2 , 0 , PRICE_CLOSE ,MODE_UPPER, 0 );   // верхняя линия Боллинджера
   double T2= iBands ( NULL , 0 , 20 , 2 , 0 , PRICE_CLOSE ,MODE_LOWER, 0 ); // нижняя линия Боллинджера
   if ((Ask>T1+StepOpen* Point )&& OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==true) OrderDelete ( 0 ); // если рынок пошел вверх – то удаляем отложенный ордер
   if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==true) return ( 0 ); // если есть ранее открытый ордер – прекращаем выполнение текущей итерации советника
   if (T1-T2<Delta* Point ) {               // если линии Боллинджера сблизились ближе чем на Delta пунктов начинаем операцию открытия ордера
       double PriceOpen= NormalizeDouble (T2-StepOpen* Point , 5 );   // вычисляем цену открытия
       double StopLoss= NormalizeDouble (T2-StepOpen* Point +SL* Point , 5 ); // вычисляем StopLoss
       double TakeProfit= NormalizeDouble (T2-StepOpen* Point -TP* Point , 5 ); // вычисляем TakeProfit
       OrderSend ( Symbol (),OP_SELL, 0.1 ,PriceOpen, 5 ,StopLoss,TakeProfit, 0 , 0 , 0 , Green ); //  открываем ордер на продажу
            }
   return ( 0 );
  }
알고리즘이 불안정하여 짧은 시간에 2개의 주문을 여는 경우도 있고, 지속적으로 OrderSend Error 130 및 OrderSend Error 138 오류를 생성하고, 시장이 반대 방향으로 이동하면 열린 주문을 삭제해도 전혀 작동하지 않습니다.

조언에 대한 큰 요청! 고맙습니다!

 
Vinin :


빅터 이바노비치!

너무 많은 플립, 왜 링크를 제공하지 않았습니까? 그들은 코드를... 왜?

 
snail09 :
정수 시작()
{
정적 날짜/시간 PrevTime=0; // 끝에서 두 번째 막대가 열리는 시간

//추가 검사

if (PrevTime==0) PrevTime=Time[0]; // 처음 시작할 때 현재 막대를 건너뜁니다.
if (시간[0]<=PrevTime) return(0); // 새 막대의 여는 시간 제어

//--주 코드

PrevTime=시간[0]; // 제로 바의 여는 시간을 기억

리턴(0);
}

바 오프닝 설정이 있는 경우 여기에 템플릿이 있으며 작동합니다.

큰 요청입니다. 이 기능을 어드바이저에 직접 입력할 수 있습니까? 그림은 하나의 바에서 열린 3개의 주문을 보여줍니다. 그리고 당신은 하나만 필요합니다. 나는 코드를 고칠 수 없습니다. 감사합니다.

 //+------------------------------------------------------------------+
int start()
//+------------------------------------------------------------------+
{
//--- Разрешение на открытие позиций - каждую свечу
if (candle_time != Time[ 0 ])
{
candle_time = Time[ 0 ];
new_bar_buy = true;
new_bar_sell = true;
}
if ( Bars < bars_count){ Print ( "Мало данных для работы" ); return ( 0 );}

//--- Получение значений индикатора iMA
ma10 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
ma20 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
ma11 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+ 1 );
ma21 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+ 1 );

if (Revers)
{
if (rsi> 50 && rsi< 70 ) //--- включена инверсия
{
//--- Условие для продажи
if (ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
if (rsi> 30 && rsi< 50 ) //--- включена инверсия
{
//--- Условие для продажи
if (ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
//--- выставление рыночных ордеров
if ( IsTradeAllowed ())
{
Trade_BUY();
Trade_SELL();
}
return ( 0 );
//+------------------------------------------------------------------+
void Trade_BUY()
//+------------------------------------------------------------------+
{

for ( int i = 0 ; i < OrdersTotal (); i++ )
{
if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
{
if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордер
if ( OrderType () == OP_BUY) // если ордер OP_BUY
{
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопа
if (trailing_stop != 0.0 && Ask > NormalizeDouble ( OrderStopLoss () + (stop_loss_buy + MathMax (min_level, trailing_stop)) * Point , Digits ) && OrderProfit () > 0 )
{

if ( OrderModify ( OrderTicket (), OrderOpenPrice (),
NormalizeDouble ( OrderStopLoss () + MathMax (min_level, trailing_stop) * Point , Digits ),
OrderTakeProfit (), 0 , CLR_NONE ))
{
Print ( "Сработал трейлинг стоп для Buy" );
}
else
{
Print ( "Ошибка модификации ордера #" , GetLastError ());
}

RefreshRates ();
Sleep ( 3000 );
} //end modify

} // end BUY
} //end OrderSelect
else
{
Print ( "OrderSelect ошибка #" , GetLastError () );
Sleep ( 3000 );
RefreshRates ();
return ;
}
} // end for
//--- Открываем ордер если есть сигнал
while (buy_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржи
if ( AccountFreeMarginCheck ( Symbol (),OP_BUY, lot) <= 0 || GetLastError () == 134 )
{
Print ( "Недостаточно свободной маржи для открытия ордера" );
buy_open = false;
break ;
}
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
if ( OrderSend ( Symbol (), OP_BUY, lot, NormalizeDouble (Ask, Digits ), slippage,
NormalizeDouble (Bid - MathMax (stop_loss_buy, min_level) * Point , Digits ),
NormalizeDouble (Bid + MathMax (take_profit_buy,min_level) * Point , Digits ),
DoubleToStr (Magic, 0 ), Magic, 0 , Blue ) > 0 )
{
PlaySound ( "Wait.wav" );
buy_open = false; // ордер открыт
break ;
}
else
{
int Error = GetLastError (); // Не получилось :(
switch (Error) // Преодолимые ошибки
{
case 138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
RefreshRates ();
continue ;
case 135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
RefreshRates ();
continue ;
case 136 : Alert ( "Нет цен." );
while ( RefreshRates () == false)
Sleep ( 500 );
continue ;
case 146 : Alert ( "Подсистема торговли занята." );
Sleep ( 500 );
RefreshRates ();
continue ;
default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
} // end switch
} // end else
break ;
} // end while
} // end Trade_BUY
//+------------------------------------------------------------------+
void Trade_SELL()
//+------------------------------------------------------------------+
{

for ( int i = 0 ; i < OrdersTotal (); i++ )
{
if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
{
if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордер
if ( OrderType () == OP_SELL) //если ордер OP_SELL
{
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );

//--- проверка на работу трейлинг стопа
if (trailing_stop != 0.0 && Bid < NormalizeDouble ( OrderStopLoss () - (stop_loss_sell + MathMax (min_level, trailing_stop)) * Point , Digits )&& OrderProfit () > 0 )
{
if ( OrderModify ( OrderTicket (), OrderOpenPrice (),
NormalizeDouble ( OrderStopLoss () - MathMax (min_level, trailing_stop) * Point , Digits ),
OrderTakeProfit (), 0 , CLR_NONE ))
{
Print ( "Сработал трейлинг стоп для Sell" );
}
else
{
Print ( "Ошибка модификации ордера #" , GetLastError ());
}

RefreshRates ();
Sleep ( 3000 );
}
} // end BUY
} //end OrderSelect
else
{
Print ( "OrderSelect ошибка #" , GetLastError () );
Sleep ( 3000 );
RefreshRates ();
return ;
}
} // end for
//--- Открываем ордер если есть сигнал
while (sell_open)
{

//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржи
if ( AccountFreeMarginCheck ( Symbol (),OP_SELL, lot) <= 0 || GetLastError () == 134 )
{
Print ( "Недостаточно свободной маржи для открытия ордера" );
sell_open = false;
break ;
}
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
if ( OrderSend ( Symbol (), OP_SELL, lot, NormalizeDouble (Bid, Digits ), slippage,
NormalizeDouble (Ask + MathMax (stop_loss_sell, min_level) * Point , Digits ),
NormalizeDouble (Ask - MathMax (take_profit_sell, min_level) * Point , Digits ),
DoubleToStr (Magic, 0 ), Magic, 0 , Blue ) > 0 )
{
PlaySound ( "Wait.wav" );
sell_open = false; // ордер открыт
break ;
}
else
{
int Error = GetLastError (); // Не получилось :(
switch (Error) // Преодолимые ошибки
{
case 138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
RefreshRates ();
continue ;
case 135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
RefreshRates ();
continue ;
case 136 : Alert ( "Нет цен." );
while ( RefreshRates () == false)
Sleep ( 500 );
continue ;
case 146 : Alert ( "Подсистема торговли занята." );
Sleep ( 500 );
RefreshRates ();
continue ;
default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
} // end switch
} // end else
break ;
} // end while
} // end Trade_SELL


//+------------------------------------------------------------------+
double Normalize_Lot( double lot) // Проверка на допустимое значение лота
//+------------------------------------------------------------------+
{
double lot_min = MarketInfo ( Symbol (), MODE_MINLOT);
double lot_max = MarketInfo ( Symbol (), MODE_MAXLOT);
double lot_step = MarketInfo ( Symbol (), MODE_LOTSTEP);
if ( lot <= lot_min ) lot = lot_min; // минимальный
else if ( lot >= lot_max ) lot = lot_max; // максимальный
else lot = MathFloor ( lot / lot_step ) * lot_step ; // округление до ближайшего меньшего
return (lot);
}

//+------------------------------------------------------------------+
int MathMax4( int i1, int i2, int i3, int i4) // Возврат максимального значения
//+------------------------------------------------------------------+
{
int imax=i1;
if (i2>imax)imax=i2;
if (i3>imax)imax=i3;
if (i4>imax)imax=i4;
return (imax);
}








 

안녕하세요 여러분 )))

진입점을 몇 번이나 지나도 1일 1개 주문으로 제한하도록 어드바이저를 도와주세요...

열기 전에 마지막으로 마감된 주문의 이력을 확인하고 일치하면 열지 않도록 유형을 작성하려고합니다 ...

for(int i=0;i<OrdersTotal();i++)
{
if( 주문선택 (i,SELECT_BY_POS, MODE_HISTORY )==true)
{
if(OrderCloseTime()==일()
부서지다;

}

뭔가 짜증나, 도와주세요 plz lamochinka)))))

 

하나의 바 사이트에서 주문:mql4.com

https://www.mql5.com/ru/forum/102366/page3

 
안녕하세요, 친애하는 포럼 사용자 여러분.
고문을 변경하는 데 도움이 필요합니다. 모든 것을 그대로 두고 액션(buy/sell)을 (sell/buy)로 변경하면 테스트 결과 상승 추세 에서는 매도가 발생하고 하락 추세에서는 구매가 발생했습니다. BUY 코드를 SELL로 간단히 변경하면 나에게 아무것도 제공하지 않거나, 내가 놓친 것
미리 감사드립니다.
파일:
 
rusa :








잘하셨어요. 주말만, 잠깐? (출장).