무료로 어드바이저를 작성해 드립니다 - 페이지 168

 
Aesen # :
Hey Anton이 내 On Balance Volume Divergence EA의 수익성을 지속적으로 높일 수 있도록 도와주시겠습니까? 코드의 일부를 변경하거나 일부 기능을 추가하고 더 좋게 만드십시오. 코드가 완전히 작동하지만 내가 얻은 결과에 만족하지 않습니다.
#include <trade/trade.mqh>

input double Lots = 0.01 ;
input int VerificationCandles = 20 ;
input int TimeGapCandles = 5 ;

input int TpPoints = 1000 ;
input int SlPoints = 1000 ;

int totalBars;
int handleOBV;

datetime timeLow1, timeLow2, timeHigh1, timeHigh2;
double low1, low2, high1, high2;
datetime timeLowOBV1, timeLowOBV2, timeHighOBV1, timeHighOBV2;
double lowObv1, lowObv2, highObv1, highObv2;

int OnInit (){
   totalBars = iBars ( _Symbol , PERIOD_CURRENT );
   
   handleOBV = iOBV ( _Symbol , PERIOD_CURRENT , VOLUME_TICK );

   return ( INIT_SUCCEEDED );
}

void OnDeinit ( const int reason){

}

void OnTick (){
   int bars = iBars ( _Symbol , PERIOD_CURRENT );
   if (totalBars != bars){
      totalBars = bars;
      
       datetime newTime = 0 ;
       double newlow = 0 , newhigh = 0 ;
      findHighLow(newlow,newhigh,newTime);
      
       datetime newTimeObv = 0 ;
       double newlowOBV = 0 , newhighOBV = 0 ;      
      findHighLowOBV(newlowOBV,newhighOBV,newTimeObv); 
      
       if (newlow != 0 || newlowOBV != 0 ){
         if (newlow != 0 ){
            low2 = low1;
            timeLow2 = timeLow1;
            low1 = newlow;
            timeLow1 = newTime;            
         }   
         if (newlowOBV != 0 ){
            lowObv2 = lowObv1;
            timeLowOBV2 = timeLowOBV1;
            lowObv1 = newlowOBV;
            timeLowOBV1=newTime;
         }
         
         ulong timeGap = TimeGapCandles * PeriodSeconds ( PERIOD_CURRENT );
         if (low1 < low2 && lowObv1 > lowObv2 && ( ulong ) MathAbs (timeLow1-timeLowOBV1) < timeGap && ( ulong ) MathAbs (timeLow2-timeLowOBV2) < timeGap){
             Print ( __FUNCTION__ ," > New Buy Signal...");
            
             double ask = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
            ask = NormalizeDouble (ask, _Digits );
            
             double tp = ask + TpPoints * _Point ;
            tp = NormalizeDouble (tp, _Digits );
            
             double sl = ask - SlPoints * _Point ;
            sl = NormalizeDouble (sl, _Digits );
            
            CTrade trade;
            trade.Buy(Lots, _Symbol ,ask,sl,tp);                 
         }
      } 
         
         if (newhigh != 0 || newhighOBV != 0 ){
             if (newhigh != 0 ){
               high2 = high1;
               timeHigh2 = timeHigh1;
               high1 = newhigh;
               timeHigh1 = newTime;
            }
             if (newhighOBV != 0 ){
               highObv2 = highObv1;
               timeHighOBV2 = timeHighOBV1;
               highObv1 = newhighOBV;
               timeHighOBV1 = newTimeObv;
            }
            
           ulong timeGap = TimeGapCandles * PeriodSeconds ( PERIOD_CURRENT );
           if (high1 > high2 && highObv1 < highObv2 && ( ulong ) MathAbs (timeHigh1-timeHighOBV1) < timeGap && ( ulong ) MathAbs (timeHigh2-timeHighOBV2) < timeGap){
             Print ( __FUNCTION__ ," > New Sell Signal...");
            
             double bid = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
            bid = NormalizeDouble (bid, _Digits );
            
             double tp = bid - TpPoints * _Point ;
            tp = NormalizeDouble (tp, _Digits );
            
             double sl = bid + SlPoints * _Point ;
            sl = NormalizeDouble (sl, _Digits );
            
            CTrade trade;
            trade.Sell(Lots, _Symbol ,bid,sl,tp);                  
         }   
      }
   }             
} 
     
void findHighLow( double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles+ 1 ;
   double high = iHigh ( _Symbol , PERIOD_CURRENT ,indexBar);
   double low = iLow ( _Symbol , PERIOD_CURRENT ,indexBar);
   datetime time = iTime ( _Symbol , PERIOD_CURRENT ,indexBar);
      
   bool isHigh = true , isLow = true ;
   for ( int i = 1 ; i <= VerificationCandles; i++){
       double highLeft = iHigh ( _Symbol , PERIOD_CURRENT ,indexBar+i);
       double highRight = iHigh ( _Symbol , PERIOD_CURRENT ,indexBar-i);
       if (highLeft > high || highRight > high) isHigh = false ;
         
       double lowLeft = iLow ( _Symbol , PERIOD_CURRENT ,indexBar+i);
       double lowRight = iLow ( _Symbol , PERIOD_CURRENT ,indexBar-i);
       if (lowLeft < low || highRight < low) isLow = false ;
          
       if (!isHigh && !isLow) break ;
       if (i == VerificationCandles){
         if (isHigh){
             Print ( __FUNCTION__ ," > Found a new high (", DoubleToString (high, _Digits ),") at ",time,"...");
             ObjectCreate ( 0 ,"High@"+ TimeToString (time), OBJ_ARROW_SELL , 0 ,time,high);
            newhigh = high;
            newTime = time;  
         }            
         if (isLow){
             Print ( __FUNCTION__ ," > Found a new low (", DoubleToString (low, _Digits ),") at ",time,"...");
             ObjectCreate ( 0 ,"Low@"+ TimeToString (time), OBJ_ARROW_BUY , 0 ,time,low); 
            newlow = low;
            newTime = time;               
         }
      }   
   }
}
   
void findHighLowOBV( double &newlow, double &newhigh, datetime &newTime){
   int indexBar = VerificationCandles;
   double OBV[];
   if ( CopyBuffer (handleOBV, 0 , 1 ,VerificationCandles* 2 + 1 ,OBV) < VerificationCandles * 2 + 1 ) return ;
   
   double value = OBV[indexBar];
   datetime time = iTime ( _Symbol , PERIOD_CURRENT ,indexBar+ 1 );
      
   bool isHigh = true , isLow = true ;
   for ( int i = 1 ; i <= VerificationCandles; i++){
       double valLeft = OBV[indexBar+i];
       double valRight = OBV[indexBar-i];
       if (valLeft > value || valRight > value) isHigh = false ;      
       if (valLeft < value || valRight < value) isLow = false ;
          
       if (!isHigh && !isLow) break ;
       if (i == VerificationCandles){
         if (isHigh){
             Print ( __FUNCTION__ ," > Found a new high (", DoubleToString (value, _Digits ),") at ",time,"...");
             ObjectCreate ( 0 ,"High@"+ TimeToString (time), OBJ_ARROW_SELL , 1 ,time,value);
            newhigh = value;
            newTime = time;    
         }
         if (isLow){
             Print ( __FUNCTION__ ," > Found a new low (", DoubleToString (value, _Digits ),") at ",time,"...");
             ObjectCreate ( 0 ,"Low@"+ TimeToString (time), OBJ_ARROW_BUY , 1 ,time,value);
            newlow = value;
            newTime = time;    
         }
      }   
   }
} 
파일:
 
Aesen # :

EA에 있으면 좋겠다고 생각한 몇 가지 기능은 가격 차트와 obv 표시기에 숨겨진 규칙적인 다이버전스가 형성될 때의 추세선이며, 아마도 멋진 후행 정지점일 수도 있고 다음과 같은 입력도 있습니다.


변하기 쉬운   값

규칙적 발산   허위 사실

숨겨진 발산   허위 사실

지표 추세선   허위 사실

가격 추세선   허위 사실


나는 babypips.com에서 얻은 이 Divergence 치트 시트를 따르기 위해 이 OBV Divergence EA를 얻으려고 합니다.


강세 다이버전스   (반전 업):

촛대 가격 - 낮음

잔고 볼륨 - 높음 낮음


약세 다이버전스(하향 반전):

촛대 가격 - 더 높음

잔고 볼륨 - 낮음 높음


강세 숨겨진 다이버전스(추세   계속 위로):

촛대 가격 - 높음 낮음

잔고 볼륨 - 낮음


약세 숨겨진 다이버전스(추세   계속 아래로):

촛대 가격-낮은 고가

잔고 볼륨 - 높음 높음

A New Approach to Interpreting Classic and Hidden Divergence. Part II
A New Approach to Interpreting Classic and Hidden Divergence. Part II
  • www.mql5.com
The article provides a critical examination of regular divergence and efficiency of various indicators. In addition, it contains filtering options for an increased analysis accuracy and features description of non-standard solutions. As a result, we will create a new tool for solving the technical task.
 
Aesen # :

EA에 있으면 좋겠다고 생각한 몇 가지 기능은 가격 차트와 obv 표시기에 숨겨진 규칙적인 다이버전스가 형성될 때의 추세선이며, 아마도 멋진 후행 정지점일 수도 있고 다음과 같은 입력도 있습니다.


변하기 쉬운   값

규칙적 발산   허위 사실

숨겨진 발산   허위 사실

지표 추세선   허위 사실

가격 추세선   허위 사실


나는 babypips.com에서 얻은 이 Divergence 치트 시트를 따르기 위해 이 OBV Divergence EA를 얻으려고 합니다.


강세 다이버전스   (반전 업):

촛대 가격 - 낮음

잔고 볼륨 - 높음 낮음


약세 다이버전스(하향 반전):

촛대 가격 - 더 높음

잔고 볼륨 - 낮음 높음


강세 숨겨진 다이버전스(추세   계속 위로):

촛대 가격 - 높음 낮음

잔고 볼륨 - 낮음


약세 숨겨진 다이버전스(추세   계속 아래로):

촛대 가격-낮은 고가

잔고 볼륨 - 높음 높음

내가 염두에 두었던 또 다른 기능은 그것이 의미가 있는 경우 EA가 배치하는 첫 번째 거래에 찬성하면 EA가 더 많은 거래를 쌓을 것이라는 것입니다....


예를 들어, EA가 강세 다이버전스를 발견하고 매수 신호가 있고 첫 번째 매수 거래가 이루어지면 거래가 EA가 배치한 첫 번째 매수 거래에 유리하게 진행되면 EA는 매수 방향으로 더 많은 거래를 쌓을 것입니다. 매도 거래라면 그 반대도 마찬가지입니다.
 
Aesen # :

내가 염두에 두었던 또 다른 기능은 그것이 의미가 있는 경우 EA가 배치하는 첫 번째 거래에 찬성하면 EA가 더 많은 거래를 쌓을 것이라는 것입니다....


예를 들어, EA가 강세 다이버전스를 발견하고 매수 신호가 있고 첫 번째 매수 거래가 이루어지면 거래가 EA가 배치한 첫 번째 매수 거래에 유리하게 진행되면 EA는 매수 방향으로 더 많은 거래를 쌓을 것입니다. 매도 거래라면 그 반대도 마찬가지입니다.
첫 번째 거래가 시작되는 구역 복구 헤징 전략을 포함할 수 있습니까? 로트 크기가 0.01인 매수가 있고 일부 핍이 있는 음의 방향(예: 30핍 아래)으로 이동하면 카운터 매도가 더 높은 핍으로 활성화됩니다. 로트 크기, 예를 들어 0.02로, 계속 하락하면 손익분기점 또는 이익에서 거래가 마감되고 루프가 다시 시작됩니다. 그러나 매도가 잘 이루어지지 않고 가격이 오르면 첫 번째 매수가 시작된 동일한 가격에서 0.03과 같은 더 높은 로트 크기의 또 다른 매수 거래가 활성화됩니다. 그것이 계속되고 순 결과가 이익이면 루프는 이익으로 거래를 닫고 다시 시작합니다. 따라서 30핍 갭이 고정되고 복구 영역이라고 하며 손실을 제거하여 더 높은 계정에 수익성이 있습니다. 프로그래밍이 가능하다면
 
코드 스크립트는 mt4가 아닌 Mt5용입니다.
 

안녕하세요. MT4 고문을 위해 작성하십시오:

현재 가격의 MA(사용 가능한 모든 이동 설정 포함)를 터치할 때 이전에 열린 모든 수동 거래를 닫습니다. 다른 것은 없습니다(반자동 조언자와 같은 것입니까?).

 
torrr 현재 가격에 도달하면 열려 있는 모든 거래를 닫습니다. 더 이상 아무것도 없습니다.

여보세요,

해볼만 하고 해보지 못했습니다. 나는 그것이 당신을 위해 작동하기를 바랍니다.

인사말.

 //+------------------------------------------------------------------+
//|                                                     Practica.mq4 |
//|                        Copyright 2022, Antonio Simón Del Vecchio |
//|                     https://www.mql5.com/es/users/simondelvecchio |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Antonio Simón Del Vecchio"
#property link        " https://www.mql5.com/es/users/simondelvecchio "
#property version    "1.00"
#property strict


input int Periodo = 50 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if ( OrdersTotal () > 0 && CruceMediaPrecio())
     {
      Cerrar();
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Cerrar()
  {
   double Precio = 0 ;
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS))
        {
         if (OrderType() == OP_BUY)
            Precio = Bid;
         else
            Precio = Ask;
         if (!OrderClose(OrderTicket(), OrderLots(), Precio, 3 , clrNONE ))
             Print ( "Error al cerrar la órden: " , GetLastError ());
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CruceMediaPrecio()
  {
   double Media = iMA ( Symbol (), PERIOD_CURRENT , Periodo, 0 , MODE_SMA , PRICE_CLOSE , 0 );
   double Max = iHigh ( Symbol (), PERIOD_CURRENT , 0 );
   double Min = iLow ( Symbol (), PERIOD_CURRENT , 0 );
   if (Max > Media && Min < Media)
     {
       return ( true );
     }
   return ( false );
  }
//+------------------------------------------------------------------+
 

받는 사람: 안토니오 시몬 델 베키오

고맙습니다! 나는 찻주전자... MetaEditor에 필요합니다   Expert Advisor를 만들고 이 코드를 붙여넣고 컴파일하면 끝인가요?

 
torrr EA를 만들고 이 코드를 삽입하고 컴파일하면 끝인가요?
옳은. 컴파일할 때 MetaEditor에서 이 파일에 지정한 이름으로 EA가 생성됩니다.

이제 나를 읽을 수 있는 사람들을 위해 일반적인 방법으로 묻습니다. 코드를 공유한 것처럼 EA를 공유하는 것이 금지되어 있습니까? .exe 파일을 의미합니다.
 
"나는 방금 요리했고 테스트 할 시간이 없었습니다." 그리고 테스터의 포지션만 마감 하는 Expert Advisor를 어떻게 실행할 수 있습니까?