AntRobot/ea/Nono.mq5

169 lines
12 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:40:14 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Nono.mq5 |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include "..\\utils\\Utils.mqh"
CTrade trade;
Utils utils;
input double Lots=0.1;
input int FEMA = 13;
input int MEMA = 26;
input int SEMA = 34;
input int stopLoss = 200;
input int takeProfit = 500;
int indicatorHandle = 0;
int currentSignal = 0;
bool isFirstSignal = true;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit() {
ResetLastError();
string path = utils.GetRelativeProgramPath();
indicatorHandle = iCustom(Symbol(), PERIOD_CURRENT, path + "\\..\\indicators\\ICrossAverage",FEMA,MEMA,SEMA);
if(indicatorHandle==INVALID_HANDLE) {
Print("CrossAverage error inicialization, Code = ", GetLastError());
return -1;
}
ChartSetInteger(0,CHART_COLOR_BACKGROUND,0);
ChartSetInteger(0, CHART_FOREGROUND,16777215);
ChartSetInteger(0,CHART_COLOR_CHART_UP,7451452);
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,255);
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,7451452);
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,255);
ChartSetInteger(0,CHART_COLOR_CHART_LINE,65280);
ChartSetInteger(0,CHART_COLOR_GRID,2697513);
ChartSetInteger(0,CHART_SHIFT,1);
ChartSetInteger(0,CHART_SHOW_BID_LINE,1);
ChartSetInteger(0,CHART_SHOW_LAST_LINE,1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
if(indicatorHandle!=INVALID_HANDLE) {
IndicatorRelease(indicatorHandle);
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
if(!checkIfNewBar())
return;
currentSignal=getTrendSignal();
if(isFirstSignal) {
isFirstSignal=false;
}
if(PositionSelect(Symbol())==true && checkPositionClose(currentSignal)==1)
return;
if(checkBuySignal(currentSignal)==1) {
double ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double takeProfitLevel = ask + takeProfit*Point();
double stopLossLevel = ask - stopLoss*Point();
trade.Buy(Lots,_Symbol,ask,stopLossLevel,takeProfitLevel,NULL);
}
if(checkIfSellSignal(currentSignal)==1) {
double bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
double takeProfitLevel = bid - takeProfit*Point();
double stopLossLevel = bid + stopLoss*Point();
trade.Sell(Lots,_Symbol,bid,stopLossLevel,takeProfitLevel,NULL);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int checkIfNewBar() {
MqlRates rates[1];
ResetLastError();
if(CopyRates(Symbol(),Period(),0,1,rates)!=1) {
Print("CopyRates error de copia, Code = ",GetLastError());
return false;
}
if(rates[0].tick_volume>1) {
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int getTrendSignal() {
double trendDirection[1];
ResetLastError();
if(CopyBuffer(indicatorHandle,0,0,1,trendDirection)!=1) {
Print("CopyBuffer error de copia, Code = ",GetLastError());
return 0;
}
//Print("CopyBuffer value = ",trendDirection[0]);
int direction = trendDirection[0];
return((int)trendDirection[0]);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int checkIfSellSignal(int currSignal) {
if(currSignal==-1) {
return 1;
}
return 0;
}
//+------------------------------------------------------------------+
int checkBuySignal(int currSignal) {
if(currentSignal==1) {
return(1);
}
return(0);
}
//---------------------------------------------------------------------
// Comprueba si necesitamos cerrar la posici<EFBFBD>n:
//---------------------------------------------------------------------
// retornos:
// 0 - ninguna posici<EFBFBD>n abierta
// 1 - posici<EFBFBD>n ya esta abierta en la direcci<EFBFBD>n de la se<EFBFBD>al
//---------------------------------------------------------------------
int checkPositionClose(int signal) {
long positionType=PositionGetInteger(POSITION_TYPE);
if(signal == 1 && positionType==(long)POSITION_TYPE_BUY) {
return 1;
}
if(signal == -1 && positionType==(long)POSITION_TYPE_SELL) {
return 1;
}
trade.PositionClose(Symbol(),10);
return 0;
}
//+------------------------------------------------------------------+