アドバイザーを無料でお書きします - ページ 168

 
Aesen #:
ヘイ、アントン......僕のオンバランス・ボリューム・ダイバージェンス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インジケーター、トレーリングストップ、そして次のような入力があると良いと思います。


変数

レギュラーダイバージェンス True/False

ヒドゥンダイバージェンス 真/偽

インジケータ トレンドライン 真/偽

価格トレンドライン True/False


私はこのOBVダイバージェンスEAをbabypips.comから入手したこのダイバージェンス・チートシートに従わせようとしています。


強気の発散(反転上昇)。

ローソク足 価格 - 安値

出来高のバランス - 安値の上昇


ベアリッシュ・ダイバージェンス(反転下落)。

ローソク足 価格-高値

出来高のバランス - 高値の下限


強気な隠れダイバージェンス(トレンドの継続上昇)。

ローソク足 価格-高値安値

出来高のバランス - 安値


弱気な隠れ発散(トレンドの継続的なダウン)。

ローソク足 価格-下値

出来高のバランス - 高値

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インジケーター、トレーリングストップ、そして次のような入力があると良いと思います。


変数

レギュラーダイバージェンス True/False

ヒドゥンダイバージェンス 真/偽

インジケータ トレンドライン 真/偽

価格トレンドライン True/False


私はこのOBVダイバージェンスEAをbabypips.comから入手したこのダイバージェンス・チートシートに従わせようとしています。


強気の発散(反転上昇)。

ローソク足 価格 - 安値

出来高のバランス - 安値の上昇


ベアリッシュ・ダイバージェンス(反転下落)。

ローソク足 価格-高値

出来高のバランス - 高値の下限


強気な隠れダイバージェンス(トレンドの継続上昇)。

ローソク足 価格-高値安値

出来高のバランス - 安値


弱気な隠れ発散(トレンドの継続的なダウン)。

ローソク足 価格-下値

出来高のバランス - 高値

もう一つの特徴は、EAが最初に仕掛けたトレードが有利になれば、さらにトレードを積み重ねるということです(意味はわかりますか?


例えば、EAが強気の乖離を見つけ、買いシグナルがあり、最初の買い取引が行われたとき、EAが行った最初の買い取引に有利な取引が行われれば、EAは買い方向にさらに取引を重ね、売り取引であればその逆をします。
 
Aesen #:

もうひとつ考えていたのは、EAが最初に仕掛けたトレードが有利になれば、さらにトレードを積み重ねるという機能です(笑)。


例えば、EAが強気の乖離を見つけ、買いシグナルがあり、最初の買い取引が行われたとき、EAが行った最初の買い取引が有利になれば、EAは買い方向に多くの取引を重ね、逆に売り取引であれば、 その逆の取引を重ねます。
ゾーンリカバリーヘッジ 戦略も含めることができますか。最初の取引はロットサイズ0.01の買いとして開始され、いくつかのpipsでマイナス方向、例えば30pips以下になると、より高いロットサイズ、例えば0.02でカウンターセルが起動し、下げ続けると、取引は損益分岐点または利益で終了しループは再び開始されます。しかし、売りがうまくいかず価格が上昇した場合、最初の買いが開始されたのと同じ価格で、より高いロットサイズ、例えば0.03の別の買いの取引が起動します。もしこれがプログラム可能であれば
 
コードスクリプトはMt5用で、Mt4用ではありません。
 

こんにちは。MT4用のEAを作成してください。

MA(利用可能なすべてのミューウィングス設定を含む)が現在の価格に タッチしたとき、以前に手動で開いたすべての取引を終了します。他にはない(セミオートマチックEAなのか?)

 
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でEAを作り、このコードを挿入してコンパイルして終わりですか?

 
torrr EAを 作成し、このコードを挿入してコンパイルして終わりなのでしょうか?
正解です。これをコンパイルすると、MetaEditorでこのファイルにつけた名前でEAが生成されます。

今、私は私を読むことができる人のための一般的な質問:私はコードを共有したように、EAを共有することは禁止されていますか? つまり、.exeファイルを意味する?
 
"調理したばかりで、テストする時間がなかった "のです。また、テスターでポジションを閉じる だけのEAを動かすにはどうしたらいいのでしょうか?
理由: