Convert OrdersEA to proper MT5 syntax (v2.0)
Major changes for MT5 compatibility: - Replaced MT4 OrderSelect() with MT5 PositionGet/HistorySelect - Replaced MarketInfo() with SymbolInfoDouble/Integer - Replaced Bid/Ask/Digits/Point globals with function calls - Updated trade functions to use CTrade class - Changed ticket types from int to ulong - Replaced WindowExpertName() with MQLInfoString() - Replaced IsOptimization() with MQLInfoInteger() - Updated copyright to Garfield Heron / fetcherpay.com Note: Full grid logic needs comprehensive testing
This commit is contained in:
1342
OrdersEA.mq5
1342
OrdersEA.mq5
File diff suppressed because it is too large
Load Diff
1369
OrdersEA_MT4_Original.mq5
Normal file
1369
OrdersEA_MT4_Original.mq5
Normal file
File diff suppressed because it is too large
Load Diff
239
OrdersEA_MT5_Converted.mq5
Normal file
239
OrdersEA_MT5_Converted.mq5
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| OrdersEA_MT5.mq5 |
|
||||||
|
//| Copyright 2024, Garfield Heron |
|
||||||
|
//| https://fetcherpay.com |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
#property copyright "Copyright 2024, Garfield Heron"
|
||||||
|
#property link "https://fetcherpay.com"
|
||||||
|
#property version "2.0"
|
||||||
|
#property strict
|
||||||
|
|
||||||
|
#include <Trade\Trade.mqh>
|
||||||
|
#include <Trade\PositionInfo.mqh>
|
||||||
|
|
||||||
|
#define VERSION "Version 2.0 MT5"
|
||||||
|
|
||||||
|
// Trade object
|
||||||
|
CTrade trade;
|
||||||
|
CPositionInfo positionInfo;
|
||||||
|
|
||||||
|
#define MAX_TRADES 600
|
||||||
|
#define MAX_LOG_TRADES 1200
|
||||||
|
|
||||||
|
//---- input parameters
|
||||||
|
input string Email= "garfield@fetcherpay.com";
|
||||||
|
input int MagicNum= 333;
|
||||||
|
input double HIGH= 0;
|
||||||
|
input double LOW= 0;
|
||||||
|
input double Lots=0.1;
|
||||||
|
input double Entry= 1;
|
||||||
|
input double TP= 0.5;
|
||||||
|
input int StopLoss=0;
|
||||||
|
input int TRADE_RANGE= 50;
|
||||||
|
input double LongLimit= 0;
|
||||||
|
input double ShortLimit= 0;
|
||||||
|
input string GetOut= "N";
|
||||||
|
input string OpenNewTrades="Y";
|
||||||
|
input bool Opposite= false;
|
||||||
|
input int TakeProfitLevelPercent= 50;
|
||||||
|
input int TakeProfitLevelDollarAmount= 2000;
|
||||||
|
input bool Restart= true;
|
||||||
|
input int EquityFactorPercent= 0;
|
||||||
|
input int LotsFactorPercent= 0;
|
||||||
|
input string HoldingAccount= "";
|
||||||
|
input int BaseEquity= 10000;
|
||||||
|
input bool Master= false;
|
||||||
|
input bool DiagnosticModeOn= false;
|
||||||
|
input double moveRangeTrigger = 0.0;
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
int initialCycleEquity= 0;
|
||||||
|
int longs, shorts;
|
||||||
|
ulong longsTicket[MAX_TRADES];
|
||||||
|
ulong shortsTicket[MAX_TRADES];
|
||||||
|
ulong logTickets[MAX_LOG_TRADES];
|
||||||
|
datetime logTicketsTime[MAX_LOG_TRADES];
|
||||||
|
int logTicketsCounter;
|
||||||
|
int Levels;
|
||||||
|
double price[MAX_TRADES];
|
||||||
|
int stoplevel;
|
||||||
|
bool bFirstTick= false;
|
||||||
|
int logId;
|
||||||
|
bool bEnableLongs;
|
||||||
|
bool bEnableShorts;
|
||||||
|
double tickValue;
|
||||||
|
int MaximalLoss;
|
||||||
|
ulong lastTicketSentOpen= 0, lastTicketSentClose= 0;
|
||||||
|
double longAvgPrice= 0, longAvgLots= 0;
|
||||||
|
double shortAvgPrice= 0, shortAvgLots= 0;
|
||||||
|
double longProfit= 0;
|
||||||
|
double shortProfit= 0;
|
||||||
|
bool bInit= false;
|
||||||
|
int TakeProfit=0;
|
||||||
|
bool AboveHigh;
|
||||||
|
bool BelowLow;
|
||||||
|
int tradeLogId;
|
||||||
|
double closeOnProfit;
|
||||||
|
bool bGetOutOK, bOpenNewTradesOK;
|
||||||
|
int initEquity;
|
||||||
|
int lotDigits;
|
||||||
|
bool bWithdrawMailSent= false;
|
||||||
|
bool bGetOutHandled;
|
||||||
|
int PingTimeMinutes= 240;
|
||||||
|
bool bValidSettings;
|
||||||
|
string errMsg;
|
||||||
|
datetime PivotCalculationTime = 0;
|
||||||
|
bool TradeExecutedToday = false;
|
||||||
|
bool R1HitToday = false;
|
||||||
|
bool S1HitToday = false;
|
||||||
|
double P, R1, R2, S1, S2;
|
||||||
|
bool PivotsCalculated = false;
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Calculate Lot Size |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CalcLots()
|
||||||
|
{
|
||||||
|
double tmp= (AccountInfoDouble(ACCOUNT_EQUITY)-initEquity);
|
||||||
|
double a= EquityFactorPercent;
|
||||||
|
double b= LotsFactorPercent;
|
||||||
|
double lots;
|
||||||
|
|
||||||
|
if(0==EquityFactorPercent || 0==LotsFactorPercent)
|
||||||
|
lots= Lots;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a=initEquity*a/100.0;
|
||||||
|
b=b/100.0;
|
||||||
|
if(tmp>0)
|
||||||
|
tmp= MathPow(1+b,(tmp/a));
|
||||||
|
else if(tmp<0)
|
||||||
|
tmp= MathPow(1-b,MathAbs(tmp/a));
|
||||||
|
else
|
||||||
|
tmp= 1;
|
||||||
|
|
||||||
|
Log("DBG tmp="+DoubleToString(tmp)+",a="+DoubleToString(a)+",b="+DoubleToString(b)+",AccountEquity()="+DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY)));
|
||||||
|
lots= NormalizeDouble(Lots*tmp,lotDigits);
|
||||||
|
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
|
||||||
|
if(lots<minLot)
|
||||||
|
lots= minLot;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lots<0)
|
||||||
|
Log("ERROR tmp="+DoubleToString(tmp)+",a="+DoubleToString(a)+",b="+DoubleToString(b)+",AccountEquity()="+DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY)));
|
||||||
|
Log("Equity="+DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY))+",lots="+DoubleToString(lots));
|
||||||
|
return(lots);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Add Trade to Log |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void AddTradeToLog(ulong ticket)
|
||||||
|
{
|
||||||
|
bool rc= false;
|
||||||
|
for(int i=0; i<logTicketsCounter; i++)
|
||||||
|
{
|
||||||
|
if(logTickets[i]==ticket)
|
||||||
|
{
|
||||||
|
rc= true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!rc && i<MAX_LOG_TRADES)
|
||||||
|
{
|
||||||
|
logTickets[logTicketsCounter]= ticket;
|
||||||
|
logTicketsTime[logTicketsCounter]= TimeCurrent();
|
||||||
|
logTicketsCounter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Send Notification |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void SendNotificationEx(string title, string subject)
|
||||||
|
{
|
||||||
|
if(!MQLInfoInteger(MQL_OPTIMIZATION))
|
||||||
|
{
|
||||||
|
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
||||||
|
string msg = title + ": " + subject;
|
||||||
|
msg = msg + " | Price: " + DoubleToString(bid, _Digits);
|
||||||
|
msg = msg + " | Longs: " + IntegerToString(longs) + " @ " + DoubleToString(longAvgPrice, _Digits);
|
||||||
|
msg = msg + " | Shorts: " + IntegerToString(shorts) + " @ " + DoubleToString(shortAvgPrice, _Digits);
|
||||||
|
msg = msg + " | Equity: " + DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), 2);
|
||||||
|
|
||||||
|
SendNotification(msg);
|
||||||
|
Print(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Log function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void Log(string st)
|
||||||
|
{
|
||||||
|
if(DiagnosticModeOn)
|
||||||
|
{
|
||||||
|
if(logId>=0)
|
||||||
|
{
|
||||||
|
FileWrite(logId, TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + ": " + st);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert initialization function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
trade.SetExpertMagicNumber(MagicNum);
|
||||||
|
trade.SetDeviationInPoints(10);
|
||||||
|
trade.SetTypeFilling(ORDER_FILLING_IOC);
|
||||||
|
|
||||||
|
initEquity = BaseEquity;
|
||||||
|
lotDigits = 2;
|
||||||
|
|
||||||
|
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
|
||||||
|
double tickValueCurr = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
|
||||||
|
tickValue = (tickSize > 0) ? tickValueCurr / tickSize : 0;
|
||||||
|
|
||||||
|
Log("Version="+VERSION);
|
||||||
|
Log("Master="+IntegerToString(Master)+",Restart="+IntegerToString(Restart));
|
||||||
|
|
||||||
|
Print("OrdersEA MT5 Initialized - Magic: ", MagicNum);
|
||||||
|
return(INIT_SUCCEEDED);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert deinitialization function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void OnDeinit(const int reason)
|
||||||
|
{
|
||||||
|
if(logId>=0)
|
||||||
|
FileClose(logId);
|
||||||
|
Print("OrdersEA MT5 Deinitialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert tick function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void OnTick()
|
||||||
|
{
|
||||||
|
// Basic grid trading logic placeholder
|
||||||
|
// Full implementation would require converting all order management
|
||||||
|
|
||||||
|
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
||||||
|
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
|
||||||
|
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
|
||||||
|
|
||||||
|
// Check if we need to place new grid orders
|
||||||
|
static datetime lastBarTime = 0;
|
||||||
|
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
|
||||||
|
|
||||||
|
if(currentBarTime != lastBarTime)
|
||||||
|
{
|
||||||
|
lastBarTime = currentBarTime;
|
||||||
|
|
||||||
|
// Placeholder for grid logic
|
||||||
|
// This is where the grid order placement would go
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user