MnQInvestmentDevelopment/MnQInvestment/02_EigeneScalpingprojekte/RejectionMagicV2.mq5

264 lines
25 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:08:44 +02:00
<EFBFBD><EFBFBD>#property copyright "Copyright 2023, M & Q Investment Group"
#property link "https://www.mql5.com"
#property version "2.00"
//IMPROVEMENT IDEAS AFTER FIRST TESTING:
// Multiple open Orders Allowed - Angepasst, Allgemeiner tradecooldown verhindert tradespam, deshalb Orderstotal und Positionstotalbedingung bei TradeIf rausgenommen
// Indicator Red not as Trigger Point, because market consolidates there much (aber keine Tradingverbotszone wsl) - Angepasst, Trigger aus Checkforrejectiofunction ausgeklammert
//Konsolidierung durch fehelende Steigung von MA21
//Auf jeden fall, wenn 21er keine steigung hat... irgendwie logisch zur trenderkennung --- wichtig
//Vielleicht grunds<EFBFBD>tzlich steigung von den MA`s in betracht ziehen --- nicht immer krass wichtig
// 21, 50 und 200 zu nahe aneinander. --- jo, bei geringer Steigung mies - Steigung MA21 w<EFBFBD>rde rechnerisch als erstes anschlagen, deshalb erstmal nur Steigung von MA21 <EFBFBD>berpr<EFBFBD>fen
// --> Angepasst, 2. MA21Shiftet Indicator erstellt, Inputs f<EFBFBD>r shift und minimale Distanz erstellt, Bedingung wird in 2.er IF-Schleife abgefragt
// Vllt 21 und 50 zu nahe aneinander?
// Trades in Richtung MA200 mit TP maximal bis MA200 - jajaja
//Neues Muster einfach auf Steigungen von MAs achten, dadurch trenderkennen (Haupts<EFBFBD>chlich MA21)
// RSI Overbought and Oversoldsignale nutzen als Trendender/Tradeblocker
// AFTER ORDER HANDLING
// 1 Normal 1:1 Order
// 1 Infinite Trailing SL
// If Order is Placed Check Opening Price snd change SL down if necessary (sollte mindestens ATR haben)
#include <trade/trade.mqh>
CTrade trade;
input int MinDistToLastSig = 5;
input double MaxCandleSizeinPoints = 100;
input double MinCandleSizeinPoints = 10;
input int TPtoSLRatio = 2;
input double RiskPerc = 1;
input double MaxDistancetoIndforRejPoints = 10;
input int SLLasthighorlowRange = 10;
input double MA21StallinDetProtRangePoints = 10;
input int MA21StallingDetShift = 10;
//input double MinimalRejWigSizePoints = 5;
int HandleZigZag;
int HandleRSI;
int HandleMA200;
int HandleMA50;
int HandleMA21;
int HandleMA21Shifted;
int TrendUp1No0Down2 = 0;
double Lostrades = 0;
double Wintrades = 0;
double AllWinRatio = 0;
double accountbalancebeginning;
double accountprofit;
int OrderCooldownSec = 300;
datetime OrderCooldownTime = 0;
int OnInit(){
string NameZigZag = "Market\\ArrowZigZag.ex5";
HandleZigZag = iCustom(_Symbol,PERIOD_CURRENT,NameZigZag,7,5,6);
HandleRSI = iRSI(_Symbol,PERIOD_CURRENT,14,PRICE_CLOSE);
HandleMA200 = iMA(_Symbol,PERIOD_CURRENT,200,0,MODE_SMMA,PRICE_CLOSE);
HandleMA50 = iMA(_Symbol,PERIOD_CURRENT,50,0,MODE_SMMA,PRICE_CLOSE);
HandleMA21 = iMA(_Symbol,PERIOD_CURRENT,21,0,MODE_SMMA,PRICE_CLOSE);
HandleMA21Shifted = iMA(_Symbol,PERIOD_CURRENT,21,MA21StallingDetShift,MODE_SMMA,PRICE_CLOSE);
accountbalancebeginning = AccountInfoDouble(ACCOUNT_BALANCE);
//OrderinAction = false
return(INIT_SUCCEEDED);
}
void OnTick(){
datetime Currenttime = TimeCurrent();
//CHECKING FOR 3LINESTRIKE PATTERN TO REDUCE OVERALL CALCULATION TIME
if((Check2LineStrikeDown() || Check2LineStrikeUp()) && Currenttime > OrderCooldownTime){
//PREPARING BASIC INDICATORS
double RSIValue[];
CopyBuffer(HandleRSI,0,0,1,RSIValue);
double MA200Value[];
CopyBuffer(HandleMA200,0,0,1,MA200Value);
double MA50Value[];
CopyBuffer(HandleMA50,0,0,1,MA50Value);
double MA21Value[];
CopyBuffer(HandleMA21,0,0,1,MA21Value);
double MA21ShiftedValue[];
CopyBuffer(HandleMA21Shifted,0,0,1,MA21ShiftedValue);
//CHECK FOR PRICE IN ZONE --- AND CHECK FOR RISING OR FALLING MA21
if(CheckForREjection(MA21Value[0],MA50Value[0],MA200Value[0],MaxDistancetoIndforRejPoints)
&& MathAbs(MA21ShiftedValue[0] - MA21Value[0]) > MA21StallinDetProtRangePoints * _Point){
//PREPARING THE TRENDDETECTOR
int IndexCurrent = -1, IndexLast = -1;
int SignalDirection = 0;
int LastsignalI = -1;
bool LastSignalReady = false;
int SignalCounter = 0;
double ZigZagindiRedTop[];
double ZigZagindiGreenBot[];
double ZigZagindiValue[];
double LastHighnLows[6];
//----------------------------------------SEARCHING THROUG THE ZIGZAGINDICATOR----
for(int i = 0; i < 1000; i++){
CopyBuffer(HandleZigZag,1,i,1,ZigZagindiRedTop);
CopyBuffer(HandleZigZag,2,i,1,ZigZagindiGreenBot);
CopyBuffer(HandleZigZag,0,i,1,ZigZagindiValue);
if(ZigZagindiValue[0] > 0){
//IF REDTOP HAS A VALUE
if(ZigZagindiRedTop[0] > 0 && SignalCounter < 6){
//INSERT THE VALUE IN GENERAL ARRAY
LastHighnLows[SignalCounter] = ZigZagindiValue [0];
//SETTING INFO ABOUT LAST SIGNAL AND DIRECTION
if(SignalCounter == 0 && i >= MinDistToLastSig){SignalDirection = -1; LastsignalI = i; LastSignalReady = true;}
else if(SignalCounter == 0 && i < MinDistToLastSig){LastsignalI = i; LastSignalReady = false;}
else if(SignalCounter == 1 && LastsignalI < MinDistToLastSig){SignalDirection = -1;}
//FINISH SIGNAL DOCUMENTATION GOTO NEXT SIGNAL
SignalCounter ++;
}
//IF GREENBOT HAS A VALUE
if(ZigZagindiGreenBot[0] > 0 && SignalCounter < 6){
//INSERT THE VALUE IN GENERAL ARRAY
LastHighnLows[SignalCounter] = ZigZagindiValue [0];
//SETTING INFO ABOUT LAST SIGNAL AND DIRECTION
if(SignalCounter == 0 && i >= MinDistToLastSig){SignalDirection = 1; LastsignalI = i; LastSignalReady = true;}
else if(SignalCounter == 0 && i < MinDistToLastSig){LastsignalI = i; LastSignalReady = false;}
else if(SignalCounter == 1 && LastsignalI < MinDistToLastSig){SignalDirection = 1;}
//FINISH SIGNAL DOCUMENTATION GOTO NEXT SIGNAL
SignalCounter ++;
}
if(SignalCounter == 6){break;}
}//END OF IF ZIGZAGARRAY HAS VALUE
}//END OF FOR LOOP
//----------------------------------------END SEARCHING THROUG THE ZIGZAGINDICATOR----
//-----------------------------------------------DETERMINE THE TREND----
if(//----------------------------------------------DOWNTREND-----
LastHighnLows[0] < LastHighnLows[2] &&
LastHighnLows[1] < LastHighnLows[3]
//&& LastHighnLows[2] < LastHighnLows[4]
){
TrendUp1No0Down2 = 2;
//TRADE BEI 3 LINE STRIKE DOWNTREND
if(Check2LineStrikeDown() > 0 /*&& OrdersTotal() == 0 && PositionsTotal() == 0*/){
double Price = SymbolInfoDouble(_Symbol,SYMBOL_BID);
int SLSourceIndex = iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,SLLasthighorlowRange,0);
double SL = iHigh(_Symbol,PERIOD_CURRENT,SLSourceIndex);
//double SL = NormalizeDouble(LastHighnLows[0],_Digits);
//double SL = Check2LineStrikeDown();
double TP = NormalizeDouble(Price - MathAbs(SL - Price) * TPtoSLRatio,_Digits);
double Lots = NormalizeDouble(CalcLots(RiskPerc,MathAbs(SL - Price)),2);
if(SL != 0){trade.Sell(Lots,_Symbol,Price,SL,TP,"Trade Downtrend after 2LineStrike");
OrderCooldownTime = Currenttime + OrderCooldownSec;}
else{Print("--------------------------UNABLE TO TRADE SL IS 0 ----------------------------------");}
Print("Check2LineStrikeDown Successful, Placing Trade... Last Candle is smaller than MaxCandleSize: ",MaxCandleSizeinPoints,
"\nRSI values are below 50: ",RSIValue[0],
"\nTrendUp1No0Down2: ",TrendUp1No0Down2,
"\nPrice: ",Price);
}
}
else if(//----------------------------------------------UPTREND
LastHighnLows[0] > LastHighnLows[2]&&
LastHighnLows[1] > LastHighnLows[3]
//&& LastHighnLows[2] > LastHighnLows[4]
){
TrendUp1No0Down2 = 1;
//TRADE BEI 3 LINE STRIKE
if(Check2LineStrikeUp() > 0 /*&& OrdersTotal() == 0 && PositionsTotal() == 0*/){
double Price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
int SLSourceIndex = iLowest(_Symbol,PERIOD_CURRENT,MODE_HIGH,SLLasthighorlowRange,0);
double SL = iLow(_Symbol,PERIOD_CURRENT,SLSourceIndex);
//double SL = NormalizeDouble(LastHighnLows[0],_Digits);
//double SL = Check2LineStrikeUp();
double TP = NormalizeDouble(Price + MathAbs(SL - Price) * TPtoSLRatio,_Digits);
double Lots = NormalizeDouble(CalcLots(RiskPerc,MathAbs(SL - Price)),2);
if(SL != 0){trade.Buy(Lots,_Symbol,Price,SL,TP,"Trade Uptrend after 2LineStrike");
OrderCooldownTime = Currenttime + OrderCooldownSec;}
else{Print("--------------------------UNABLE TO TRADE SL IS 0 ----------------------------------");}
Print("Check2LineStrikeUP Successful, Placing Trade... Last Candle is smaller than MaxCandleSize: ",MaxCandleSizeinPoints,
"\nRSI values are above 50: ",RSIValue[0],
"\nTrendUp1No0Down2: ",TrendUp1No0Down2,
"\nPrice: ",Price);
}
}
else{TrendUp1No0Down2 = 0;}
}// END IF CHECK FOR PRICE IN MAs ZONE
}//------------------------------------------------------END IF THERE IS A STRIKE PATTERN
//GENERAL INFORMATION FOR THE CHART
double accountequity = AccountInfoDouble(ACCOUNT_EQUITY);
accountprofit = accountequity - accountbalancebeginning;
accountprofit = NormalizeDouble(accountprofit,2);
Comment("\nCurrenttime: ",TimeCurrent(),
"\nProfit: ",accountprofit,
"\nEquity: ",accountequity,
"\nCurrent Trend, TrendUp1No0Down2: ",TrendUp1No0Down2);
}//END ON TICK
void OnDeinit(const int reason){
Lostrades = TesterStatistics(STAT_LOSS_TRADES);
Wintrades = TesterStatistics(STAT_PROFIT_TRADES);
if(Lostrades + Wintrades > 0){
AllWinRatio = NormalizeDouble(Wintrades / (Wintrades + Lostrades),2);
}else{AllWinRatio = 0;}
Print("Verlorene Trades: ",Lostrades,
"\nGewonnenen Trades: ",Wintrades,
"\nGewinnrate:________",AllWinRatio);
}
//CHECK FOR REJECTION
bool CheckForREjection(double MA21Value, double MA50Value, double MA200Value, double MaxDistance/*, double MinimalRejWigSizePointz*/){
double Open1 = iOpen(_Symbol,PERIOD_CURRENT,1);
double Close1 = iClose(_Symbol,PERIOD_CURRENT,1);
double Low1 = iLow(_Symbol,PERIOD_CURRENT,1);
double High1 = iHigh(_Symbol,PERIOD_CURRENT,1);
double Open2 = iOpen(_Symbol,PERIOD_CURRENT,2);
double Close2 = iClose(_Symbol,PERIOD_CURRENT,2);
double Low2 = iLow(_Symbol,PERIOD_CURRENT,2);
double High2 = iHigh(_Symbol,PERIOD_CURRENT,2);
double MA21ValueLow = MA21Value - MaxDistance * _Point;
double MA21ValueHigh = MA21Value + MaxDistance * _Point;
double MA50ValueLow = MA50Value - MaxDistance * _Point;
double MA50ValueHigh = MA50Value + MaxDistance * _Point;
double MA200ValueLow = MA200Value - MaxDistance * _Point;
double MA200ValueHigh = MA200Value + MaxDistance * _Point;
if(//(MA200ValueLow > Low1 && MA200ValueLow < High1) || (MA200ValueHigh > Low1 && MA200ValueHigh < High1) ||
(MA50ValueLow > Low1 && MA50ValueLow < High1) || (MA50ValueHigh > Low1 && MA50ValueHigh < High1)
|| (MA21ValueLow > Low1 && MA21ValueLow < High1) || (MA21ValueHigh > Low1 && MA21ValueHigh < High1)){
//MinimalRejWigSizePointz;
return true;
//bedingungen m<EFBFBD>ssen noch so angepasst werden, dass falls muster auftritt und trend besteht getraded wird unabh<EFBFBD>ngig wie weit letztes
//hoch entfernt ist oder welcher schenkel gerade der kurs ist
}else{return false;}
}