무료로 어드바이저를 작성해 드립니다 - 페이지 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를 어떻게 실행할 수 있습니까?