Files
ironsan2kk-pixel 6450d1efc6 Fix download links
2026-06-08 10:36:15 +02:00

486 lines
14 KiB
Plaintext

//+------------------------------------------------------------------+
//| StrategyOne.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "3.00"
#property strict
#include <Mql4Book\Timer.mqh>
#include <NNFX\Indicators\Baseline\NiKijun.mqh>
#include <NNFX\Indicators\Baseline\NiMA.mqh>
#include <NNFX\Indicators\NiSSLActivator.mqh>
#include <NNFX\Indicators\Confirmation\NiASH.mqh>
#include <NNFX\Indicators\Volumen\NiWAE.mqh>
#include <NNFX\Indicators\Exit\NiRex.mqh>
#include <NNFX\Indicators\NiNone.mqh>
#include <NNFX\Money\NiMoney.mqh>
#include <NNFX\Money\NiMoneyScaleOut.mqh>
#include <NNFX\functions.mqh>
//--- inputs
input int InpMagic = 1024;
input int Deviation = 50;
input string x7 = "------Special Rules-----";
input bool ApplySevenCandleRule = false;
input bool ApplyOneCandleRule = true;
input bool ApplyPullbackRule = true;
input bool ApplyContinuationRule = true;
input string x = "----Baseline-----";
input int InpKijun_b = 26; //InpKijun
input string x2 = "------C1-----------";
input int InpPeriods_C1 = 14; // InpPeriods
input ENUM_MA_METHOD InpMethod_C1 = MODE_SMA; //InpMethod
input string x3 = "------C2-----------";
input string InpModeStr_C2="Mode: 0 - RSI, 1 - Stoch";
input int InpMode_C2=0; // InpMode
input int InpLength_C2=9; //InpLength
input int InpSmooth_Length_C2=2; // InpSmooth_Length
input int InpPrice_C2=0; // InpPrice
// Applied price
// 0 - Close
// 1 - Open
// 2 - High
// 3 - Low
// 4 - Median
// 5 - Typical
// 6 - Weighted
input int InpMethod_C2=0;
// 0 - SMA
// 1 - EMA
// 2 - SMMA
// 3 - LWMA
input string x4 = "---------Volumen------";
input int InpSensetive_v = 150; //InpSensitive
input int InpDeadZonePip_v = 30; // InpDeadZonePip
input int InpExplosionPower_v = 15; // InpExplosionPower
input int InpTrendPower_v = 15; // InpTrendPower
input string x5 = "---------Exit---------";
input int InpSmoothing_Length_x=14; // InpSmoothing_Length
input int InpSmoothing_Method_x=0; // InpSmoothing_Method
// 0 - SMA
// 1 - EMA
// 2 - SMMA
// 3 - LWMA
input int InpSignal_Length_x=14; // InpSignal_Length
input int InpSignal_Method_x=0; // InpSignal_Method
// 0 - SMA
// 1 - EMA
// 2 - SMMA
// 3 - LWMA
input string x6 = "---------Monet management------";
input int InpTakeProfit = 100;
input int InpStopLoss = 100;
input double InpLotSize = 0.05;
//--- global variables
CNewBar NewBar;
string symbol;
int period;
bool longPosition;
bool shortPosition;
bool isPositionOpened;
bool OneCandleForLong;
bool OneCandleForShort;
OrderState orderState;
EnterTime forLong;
EnterTime forShort;
TrendStatus trendStatus;
//NiKijun *baseline;
NiMA *baseline;
/*
NiSSLActivator *c1;
NiASH *c2;
NiWAE *volumeIndicator;
NiRex *exitIndicator;
*/
NiNone *c1;
NiNone *c2;
NiNone *volumeIndicator;
NiNone *exitIndicator;
IMoney *money;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
orderState.LongPosition = false;
orderState.ShortPosition = false;
orderState.OrderStatus = false;
symbol = _Symbol;
period = _Period;
//baseline = new NiKijun(InpKijun_b);
baseline = new NiMA(30,0,MODE_SMA,PRICE_CLOSE);
/*
c1 = new NiSSLActivator(InpPeriods_C1,InpMethod_C1);
c2 = new NiASH(InpModeStr_C2,InpMode_C2,InpLength_C2,InpSmooth_Length_C2,InpPrice_C2,InpMethod_C2);
volumeIndicator = new NiWAE(InpSensetive_v,InpDeadZonePip_v,InpExplosionPower_v,InpTrendPower_v);
exitIndicator = new NiRex(InpSmoothing_Length_x,InpSmoothing_Method_x,InpSignal_Length_x,InpSignal_Method_x);
*/
c1 = new NiNone();
c2 = new NiNone();
volumeIndicator = new NiNone();
exitIndicator = new NiNone();
baseline.InitIndicator(symbol,period);
c1.InitIndicator(symbol,period);
c2.InitIndicator(symbol,period);
volumeIndicator.InitIndicator(symbol,period);
exitIndicator.InitIndicator(symbol,period);
//money = new NiMoney(InpLotSize,InpTakeProfit,InpStopLoss,InpMagic,Deviation);
money = new NiMoneyScaleOut(InpLotSize,InpMagic,Deviation);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
delete baseline;
delete c1;
delete c2;
delete volumeIndicator;
delete exitIndicator;
delete money;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---Detect New Bar
bool isNewBar = NewBar.checkNewBar(_Symbol,_Period);
//datetime t = iTime(_Symbol,_Period,0);
//Print("now: " + t);
if(!isNewBar){
return;
}
//Print("On new Bar");
OnBar();
}
//+------------------------------------------------------------------+
//|OnBar function |
//+------------------------------------------------------------------+
void OnBar()
{
//---Update Buffers
Refresh();
//---Exit rules
if(money.isOpenedPosition()){
manageClose();
}
//---Entry Rules
if(!money.isOpenedPosition()){
manageOpen();
}
}
//+------------------------------------------------------------------+
//|Open Positions: Entry rules |
//+------------------------------------------------------------------+
void manageOpen()
{
manageLong();
manageShort();
if(money.isOpenedPosition()) {
//Print("Position openend...");
//Print("position status: "+orderState.OrderStatus);
}
}
/*
* Checks conditions if is possible open long positions
*/
bool manageLong()
{
bool LongSignal = false;
bool InSevenCandles = false;
//--- Triggers an entry signal event, then checks all rules
if(c1.entryLong() || c2.entryLong()|| baseline.entryLong() || (OneCandleForLong && ApplyOneCandleRule)){
//--- Apply Seven Candle rule
if(ApplySevenCandleRule)
{ InSevenCandles = SevenCandleRuleForLong(); }
else{ InSevenCandles = false;}
//-- Checks all Indicators for a long trade
if((InSevenCandles && ApplySevenCandleRule) || !ApplySevenCandleRule ){
LongSignal = checkLongConditions();
if(OneCandleForLong && LongSignal) Print("Trade ok by one candle rule");
}
//--- Apply One candle Rule
if(!LongSignal && !OneCandleForLong && ApplyOneCandleRule)
{ OneCandleForLong = true;}
else if(OneCandleForLong == true)
{ OneCandleForLong = false;}
//---Apply Continuation Trade Rule
if(!LongSignal && ApplyContinuationRule && ((InSevenCandles && ApplySevenCandleRule) || !ApplySevenCandleRule))
{
if(baseline.entryLong()) {
trendStatus.EnteredInLong = Time[1];
}
if(trendStatus.EnteredInLong > trendStatus.EnteredInShort && trendStatus.EnteredInLong > Time[7])
{
LongSignal = checkContinuationLongConditions();
if(LongSignal) Print("Continuation Trade ok");
}
}
}
if(LongSignal){
money.OpenLong();
Print("Open Signal Long");
}
return LongSignal;
}
/*
* Use Special conditions in a continuation trade
*/
bool checkContinuationLongConditions()
{
bool LongSignal = baseline.baselineDirection() > 0.0 && c1.confirmationLong() && c2.confirmationLong();
return LongSignal;
}
/*
* Checks if c1,c2 gives the signal with in seven candles
*/
bool SevenCandleRuleForLong()
{
bool entrySignal = false;
if(c1.entryLong()) forLong.c1EnteredTime = Time[1];
if(c2.entryLong()) forLong.c2EnteredTime = Time[1];
//Print("7 candle rule: c1:" + forLong.c1EnteredTime + ", c2:" + forLong.c2EnteredTime);
//Print("7 candle rule: time: " + Time[7]);
if(forLong.c1EnteredTime > Time[7] && forLong.c2EnteredTime > Time[7])
{
//Print("7 candle rule: entry");
entrySignal = true;
}
return entrySignal;
}
//+------------------------------------------------------------------+
//|Check conditions for entry long position |
//+------------------------------------------------------------------+
bool checkLongConditions(){
bool openSignal = false;
double atr_value = iATR(symbol,period,14,1);
if(volumeIndicator.confirmationLong()){ // Enough volumen to open a position
if(baseline.baselineDirection() > 0.0 && (!ApplyPullbackRule || (ApplyPullbackRule && baseline.baselineDirection() < atr_value))){ // In long tendency
if(c1.confirmationLong() && c2.confirmationLong()){
openSignal = true;
}
}
}
Print("In long: " +volumeIndicator.confirmationLong() +" " + baseline.baselineDirection() + " "+ c1.confirmationLong() + c2.confirmationLong());
//openSignal = volumeIndicator.isAbleOpenPosition() && (baseline.baselineDirection(0) > 0.0) && c1.signalLong() && c2.signalLong();
return openSignal;
}
bool manageShort()
{
bool ShortSignal = false;
bool InSevenCandles = false;
if(c1.entryShort() || c2.entryShort() || baseline.entryShort() || (OneCandleForShort && ApplyOneCandleRule) ){
//--- Apply Seven Candle rule
if(ApplySevenCandleRule)
{ InSevenCandles = SevenCandleRuleForShort(); }
else{ InSevenCandles = false;}
//--------------------
//-- Checks all Indicators for a short trade
if((InSevenCandles && ApplySevenCandleRule) || !ApplySevenCandleRule ){
ShortSignal = checkShortConditions();
if(OneCandleForShort && ShortSignal) Print("Short trade ok by one candle rule");
} //-----------
//--- Apply One candle Rule
if(!ShortSignal && !OneCandleForShort && ApplyOneCandleRule)
{ OneCandleForShort = true;}
else if(OneCandleForShort == true)
{ OneCandleForShort = false;}
//--------
//---Apply Continuation Trade Rule
if(!ShortSignal && ApplyContinuationRule && ((InSevenCandles && ApplySevenCandleRule) || !ApplySevenCandleRule))
{
if(baseline.entryShort()) {
trendStatus.EnteredInShort = Time[1];
}
if(trendStatus.EnteredInShort > trendStatus.EnteredInLong && trendStatus.EnteredInShort > Time[7])
{
ShortSignal = checkContinuationShortConditions();
if(ShortSignal) Print("Continuation short Trade ok");
}
}// end continuation trade rule
}
if(ShortSignal){
money.OpenShort();
Print("Open Signal Short");
}
return ShortSignal;
}
/*
* Use Special conditions in a continuation trade
*/
bool checkContinuationShortConditions()
{
bool ShortSignal = baseline.baselineDirection() < 0.0 && c1.confirmationShort() && c2.confirmationShort();
return ShortSignal;
}
/*
* Checks if c1,c2 gives the signal with in seven candles
*/
bool SevenCandleRuleForShort()
{
bool entrySignal = false;
if(c1.entryShort()) forShort.c1EnteredTime = Time[1];
if(c2.entryShort()) forShort.c2EnteredTime = Time[1];
if(forShort.c1EnteredTime > Time[7] && forShort.c2EnteredTime > Time[7])
{
entrySignal = true;
}
return entrySignal;
}
//+------------------------------------------------------------------+
//|Check conditions for entry short position |
//+------------------------------------------------------------------+
bool checkShortConditions(){
bool openSignal = false;
double atr_value = iATR(symbol,period,14,1);
if(volumeIndicator.confirmationShort()){
if(baseline.baselineDirection() < 0.0 && (!ApplyPullbackRule || (ApplyPullbackRule && baseline.baselineDirection() < -1*atr_value)) ){
if(c1.confirmationShort() && c2.confirmationShort()){
openSignal = true;
}
}
}
Print("In short: " + volumeIndicator.confirmationShort() +" " + baseline.baselineDirection() + " "+ c1.confirmationShort() + c2.confirmationShort());
//openSignal = volumeIndicator.isAbleOpenPosition() && (baseline.baselineDirection(0) < 0.0) && c1.signalShort() && c2.signalShort();
return openSignal;
}
//+------------------------------------------------------------------+
//|Close Positions: Exit rules |
//+------------------------------------------------------------------+
void manageClose()
{
bool closeSignal = false;
if(money.isLongPosition()){
closeSignal = exitIndicator.exitLong();
}else if(money.isShortPosition()){
closeSignal = exitIndicator.exitShort();
}
if(closeSignal)
{
if(money.isLongPosition()){
money.CloseLongPosition();
}else if(money.isShortPosition()){
money.CloseShortPosition();
}
Print("Close Signal");
//Print("Position closed...");
//Print("position status: "+orderState.OrderStatus);
}
}
//+------------------------------------------------------------------+
//|Refresh indicators buffers data |
//+------------------------------------------------------------------+
void Refresh()
{
baseline.Refresh();
c1.Refresh();
c2.Refresh();
volumeIndicator.Refresh();
exitIndicator.Refresh();
money.Refresh();
/*Maybe In NiMomey class*/
int i = 0;
bool flag = false;
while(i< OrdersTotal() && !flag)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderMagicNumber() == InpMagic)
{
flag = true;
}
i++;
}
if(!flag){ /*No orders made by this EA founded*/
money.InitTSParams();
}
//Print("Orders total :" + OrdersTotal());
}