new version update
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| TradeFunctions.mqh |
|
||||
//| Copyright 2017, AZ-iNVEST |
|
||||
//| http://www.az-invest.eu |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2017, AZ-iNVEST"
|
||||
#property link "http://www.az-invest.eu"
|
||||
//
|
||||
// Copyright 2017-2018, Artur Zas
|
||||
// https://www.az-invest.eu
|
||||
// https://www.mql5.com/en/users/arturz
|
||||
//
|
||||
|
||||
#include <Trade\Trade.mqh>
|
||||
#include <AZ-INVEST/SDK/Normailze.mqh>
|
||||
#include <AZ-INVEST/SDK/TradingChecks.mqh>
|
||||
CTradingChecks tradingChecks;
|
||||
|
||||
#define POSITION_TYPE_NONE -1
|
||||
|
||||
@@ -15,40 +17,58 @@
|
||||
|
||||
struct CMarketOrderParameters
|
||||
{
|
||||
bool m_async_mode; // trade mode
|
||||
ulong m_magic; // expert magic number
|
||||
ulong m_deviation; // deviation default
|
||||
bool m_async_mode; // trade mode
|
||||
ulong m_magic; // expert magic number
|
||||
ulong m_deviation; // deviation default
|
||||
ENUM_ORDER_TYPE_FILLING m_type_filling;
|
||||
|
||||
int numberOfRetries;
|
||||
int busyTimeout_ms;
|
||||
int requoteTimeout_ms;
|
||||
|
||||
int numberOfRetries;
|
||||
int busyTimeout_ms;
|
||||
int requoteTimeout_ms;
|
||||
};
|
||||
|
||||
class CMarketOrder
|
||||
{
|
||||
protected:
|
||||
|
||||
CTrade * ctrade;
|
||||
CTrade *ctrade;
|
||||
|
||||
int numberOfRetries;
|
||||
int busyTimeout_ms;
|
||||
int requoteTimeout_ms;
|
||||
bool initialized;
|
||||
|
||||
int numberOfRetries;
|
||||
int busyTimeout_ms;
|
||||
int requoteTimeout_ms;
|
||||
|
||||
public:
|
||||
|
||||
CMarketOrder(void);
|
||||
CMarketOrder(CMarketOrderParameters ¶ms);
|
||||
~CMarketOrder(void);
|
||||
|
||||
bool Long(string symbol, double lots, uint stoploss = 0, uint takeprofit = 0);
|
||||
bool Long(string symbol,double lots, double priceSL=0,double priceTP=0);
|
||||
bool Short(string symbol,double lots, uint stoploss = 0, uint takeprofit = 0);
|
||||
bool Short(string symbol,double lots, double priceSL=0,double priceTP=0);
|
||||
bool Modify(ulong ticket, uint stoploss = 0, uint takeprofit = 0);
|
||||
bool Initialize(CMarketOrderParameters ¶ms);
|
||||
bool IsInitialized() {return initialized;};
|
||||
|
||||
bool Long(string symbol, double lots, uint stoploss = 0, uint takeprofit = 0,bool stopsInPips = true, string comment = "");
|
||||
bool Long(string symbol,double lots, double priceSL=0,double priceTP=0, string comment = "");
|
||||
bool Short(string symbol,double lots, uint stoploss = 0, uint takeprofit = 0,bool stopsInPips = true, string comment = "");
|
||||
bool Short(string symbol,double lots, double priceSL=0,double priceTP=0, string comment = "");
|
||||
|
||||
bool PendingLong(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "");
|
||||
bool PendingLong(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, double priceSL=0, double priceTP=0, string comment = "");
|
||||
bool PendingShort(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "");
|
||||
bool PendingShort(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, double priceSL=0, double priceTP=0, string comment = "");
|
||||
|
||||
bool Modify(ulong ticket, bool stopsInPips = true, int stoploss = -1, int takeprofit = -1);
|
||||
bool Modify(ulong ticket, double priceSL=0,double priceTP=0);
|
||||
|
||||
bool ModifyPending(ulong ticket, double entry, bool stopsInPips = true, int stoploss = -1, int takeprofit = -1, ENUM_ORDER_TYPE_TIME orderTypeTime = ORDER_TIME_GTC, datetime expires = 0);
|
||||
bool ModifyPending(ulong ticket, double entry, double priceSL=0, double priceTP=0, ENUM_ORDER_TYPE_TIME orderTypeTime = ORDER_TIME_GTC, datetime expires = 0);
|
||||
|
||||
bool Close(ulong ticket);
|
||||
bool ClosePartial(ulong ticket, double lots);
|
||||
bool CloseAll(string symbol = "");
|
||||
bool Delete(ulong ticket);
|
||||
|
||||
bool Reverse(ulong ticket,double lots = 0, uint stoploss=0, uint takeprofit=0);
|
||||
bool Reverse(ulong ticket,double lots = 0, double priceSL=0,double priceTP=0);
|
||||
bool IsOpen(string symbol, ENUM_POSITION_TYPE type, long magicNumber = 0);
|
||||
@@ -57,8 +77,13 @@ class CMarketOrder
|
||||
bool IsOpen(ulong &ticket, string symbol, long magicNumber = 0);
|
||||
bool IsOpen(ulong &ticket, ENUM_POSITION_TYPE &type, string symbol, long magicNumber = 0);
|
||||
|
||||
bool GetPositionType(ulong ticket, ENUM_POSITION_TYPE &_pType);
|
||||
string PositionTypeToString(ENUM_POSITION_TYPE t);
|
||||
string OrderTypeToString(ENUM_ORDER_TYPE t);
|
||||
ENUM_ORDER_TYPE TradeBias(ENUM_ORDER_TYPE t);
|
||||
bool RetryOrderRequest(int retryNumber);
|
||||
|
||||
void SetTradeId(ulong tradeId);
|
||||
|
||||
private:
|
||||
|
||||
@@ -68,19 +93,31 @@ class CMarketOrder
|
||||
|
||||
};
|
||||
|
||||
CMarketOrder::CMarketOrder(void)
|
||||
{
|
||||
ctrade = new CTrade();
|
||||
this.initialized = false;
|
||||
}
|
||||
|
||||
CMarketOrder::CMarketOrder(CMarketOrderParameters ¶ms)
|
||||
{
|
||||
ctrade = new CTrade();
|
||||
Initialize(params);
|
||||
}
|
||||
|
||||
bool CMarketOrder::Initialize(CMarketOrderParameters ¶ms)
|
||||
{
|
||||
ctrade.SetExpertMagicNumber(params.m_magic);
|
||||
ctrade.SetDeviationInPoints(params.m_deviation);
|
||||
ctrade.SetTypeFilling(params.m_type_filling);
|
||||
ctrade.SetAsyncMode(params.m_async_mode);
|
||||
|
||||
this.numberOfRetries = (params.numberOfRetries == 0) ? 25 : params.numberOfRetries;
|
||||
this.busyTimeout_ms = (params.busyTimeout_ms == 0) ? 1000 : params.busyTimeout_ms;
|
||||
this.requoteTimeout_ms = (params.requoteTimeout_ms == 0) ? 250 : params.requoteTimeout_ms;
|
||||
this.numberOfRetries = (params.numberOfRetries == 0) ? 25 : params.numberOfRetries;
|
||||
this.busyTimeout_ms = (params.busyTimeout_ms == 0) ? 1000 : params.busyTimeout_ms;
|
||||
this.requoteTimeout_ms = (params.requoteTimeout_ms == 0) ? 250 : params.requoteTimeout_ms;
|
||||
|
||||
this.initialized = true;
|
||||
return this.initialized;
|
||||
}
|
||||
|
||||
CMarketOrder::~CMarketOrder(void)
|
||||
@@ -89,7 +126,7 @@ CMarketOrder::~CMarketOrder(void)
|
||||
delete ctrade;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Long(string symbol, double lots,uint stoploss=0,uint takeprofit=0)
|
||||
bool CMarketOrder::Long(string symbol, double lots,uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
@@ -97,14 +134,21 @@ bool CMarketOrder::Long(string symbol, double lots,uint stoploss=0,uint takeprof
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
double price = SymbolInfoDouble(symbol,SYMBOL_ASK);
|
||||
double _point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
|
||||
//calc SL + TP
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price - stoploss*_point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price + takeprofit*_point) : 0.0);
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price - stoploss*point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price + takeprofit*point) : 0.0);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,ORDER_TYPE_BUY,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to buy
|
||||
result = ctrade.Buy(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP);
|
||||
result = ctrade.Buy(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP, comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -121,7 +165,7 @@ bool CMarketOrder::Long(string symbol, double lots,uint stoploss=0,uint takeprof
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Long(string symbol, double lots,double priceSL=0,double priceTP=0)
|
||||
bool CMarketOrder::Long(string symbol, double lots,double priceSL=0,double priceTP=0, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
@@ -130,8 +174,15 @@ bool CMarketOrder::Long(string symbol, double lots,double priceSL=0,double price
|
||||
{
|
||||
double price = SymbolInfoDouble(symbol,SYMBOL_ASK);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,ORDER_TYPE_BUY,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to buy
|
||||
result = ctrade.Buy(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP);
|
||||
result = ctrade.Buy(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP, comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -148,7 +199,7 @@ bool CMarketOrder::Long(string symbol, double lots,double priceSL=0,double price
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Short(string symbol, double lots,uint stoploss=0,uint takeprofit=0)
|
||||
bool CMarketOrder::Short(string symbol, double lots,uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
@@ -156,14 +207,21 @@ bool CMarketOrder::Short(string symbol, double lots,uint stoploss=0,uint takepro
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
double price = SymbolInfoDouble(symbol,SYMBOL_BID);
|
||||
double _point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
|
||||
//calc SL + TP
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price + stoploss*_point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price - takeprofit*_point) : 0.0);
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price + stoploss*point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price - takeprofit*point) : 0.0);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,ORDER_TYPE_SELL,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to sell
|
||||
result = ctrade.Sell(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP);
|
||||
result = ctrade.Sell(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP, comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -180,7 +238,7 @@ bool CMarketOrder::Short(string symbol, double lots,uint stoploss=0,uint takepro
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Short(string symbol, double lots,double priceSL=0,double priceTP=0)
|
||||
bool CMarketOrder::Short(string symbol, double lots,double priceSL=0,double priceTP=0, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
@@ -189,8 +247,15 @@ bool CMarketOrder::Short(string symbol, double lots,double priceSL=0,double pric
|
||||
{
|
||||
double price = SymbolInfoDouble(symbol,SYMBOL_BID);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,ORDER_TYPE_SELL,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to sell
|
||||
result = ctrade.Sell(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP);
|
||||
result = ctrade.Sell(NormalizeLots(symbol,lots), symbol, price, priceSL, priceTP, comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -207,24 +272,202 @@ bool CMarketOrder::Short(string symbol, double lots,double priceSL=0,double pric
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Modify(ulong ticket, uint stoploss = 0, uint takeprofit = 0)
|
||||
|
||||
bool CMarketOrder::PendingLong(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
|
||||
//calc SL + TP
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price - stoploss*point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price + takeprofit*point) : 0.0);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,orderType,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to place buy
|
||||
if(orderType == ORDER_TYPE_BUY_LIMIT)
|
||||
result = ctrade.BuyLimit(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
else if(orderType == ORDER_TYPE_BUY_STOP)
|
||||
result = ctrade.BuyStop(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string err = ctrade.ResultRetcodeDescription();
|
||||
MessageBox(err,"Operation failed",MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::PendingLong(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, double priceSL=0, double priceTP=0, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,orderType,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to buy
|
||||
if(orderType == ORDER_TYPE_BUY_LIMIT)
|
||||
result = ctrade.BuyLimit(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
else if(orderType == ORDER_TYPE_BUY_STOP)
|
||||
result = ctrade.BuyStop(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string err = ctrade.ResultRetcodeDescription();
|
||||
MessageBox(err,"Operation failed",MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CMarketOrder::PendingShort(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, uint stoploss=0,uint takeprofit=0,bool stopsInPips = true, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
|
||||
//calc SL + TP
|
||||
double priceSL = (stoploss ? NormalizePrice(symbol,price + stoploss*point) : 0.0);
|
||||
double priceTP = (takeprofit ? NormalizePrice(symbol,price - takeprofit*point) : 0.0);
|
||||
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,orderType,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to sell
|
||||
if(orderType == ORDER_TYPE_SELL_LIMIT)
|
||||
result = ctrade.SellLimit(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
else if(orderType == ORDER_TYPE_SELL_STOP)
|
||||
result = ctrade.SellStop(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string err = ctrade.ResultRetcodeDescription();
|
||||
MessageBox(err,"Operation failed",MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::PendingShort(ENUM_ORDER_TYPE orderType, string symbol, double lots, double price, double priceSL=0, double priceTP=0, string comment = "")
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToOpenPosition(symbol,orderType,lots,price,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to place trade: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to sell
|
||||
if(orderType == ORDER_TYPE_SELL_LIMIT)
|
||||
result = ctrade.SellLimit(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
else if(orderType == ORDER_TYPE_SELL_STOP)
|
||||
result = ctrade.SellStop(NormalizeLots(symbol,lots),price,symbol,priceSL,priceTP,ORDER_TIME_GTC,0,comment);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string err = ctrade.ResultRetcodeDescription();
|
||||
MessageBox(err,"Operation failed",MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Modify(ulong ticket, bool stopsInPips = true, int stoploss = -1, int takeprofit = -1)
|
||||
{
|
||||
if(!PositionSelectByTicket(ticket))
|
||||
return false;
|
||||
|
||||
string symbol = PositionGetString(POSITION_SYMBOL);
|
||||
double price = PositionGetDouble(POSITION_PRICE_CURRENT);
|
||||
double _point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
double price = PositionGetDouble(POSITION_PRICE_OPEN);
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
double priceSL;
|
||||
double priceTP;
|
||||
|
||||
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){
|
||||
priceSL = (stoploss ? NormalizePrice(symbol,price - stoploss*_point) : PositionGetDouble(POSITION_SL));
|
||||
priceTP = (takeprofit ? NormalizePrice(symbol,price + takeprofit*_point) : PositionGetDouble(POSITION_TP));
|
||||
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
|
||||
{
|
||||
priceSL = (stoploss < 0)
|
||||
? PositionGetDouble(POSITION_SL)
|
||||
: (stoploss == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,price - stoploss*point);
|
||||
|
||||
priceTP = (takeprofit < 0)
|
||||
? PositionGetDouble(POSITION_TP)
|
||||
: (takeprofit == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,price + takeprofit*point);
|
||||
// priceSL = (stoploss ? NormalizePrice(symbol,price - stoploss*_point) : PositionGetDouble(POSITION_SL));
|
||||
// priceTP = (takeprofit ? NormalizePrice(symbol,price + takeprofit*_point) : PositionGetDouble(POSITION_TP));
|
||||
}
|
||||
else if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){
|
||||
priceSL = (stoploss ? NormalizePrice(symbol,price + stoploss*_point) : PositionGetDouble(POSITION_SL));
|
||||
priceTP = (takeprofit ? NormalizePrice(symbol,price - takeprofit*_point) : PositionGetDouble(POSITION_TP));
|
||||
else if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
|
||||
{
|
||||
// priceSL = (stoploss ? NormalizePrice(symbol,price + stoploss*_point) : PositionGetDouble(POSITION_SL));
|
||||
// priceTP = (takeprofit ? NormalizePrice(symbol,price - takeprofit*_point) : PositionGetDouble(POSITION_TP));
|
||||
priceSL = (stoploss < 0)
|
||||
? PositionGetDouble(POSITION_SL)
|
||||
: (stoploss == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,price + stoploss*point);
|
||||
|
||||
priceTP = (takeprofit < 0)
|
||||
? PositionGetDouble(POSITION_TP)
|
||||
: (takeprofit == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,price - takeprofit*point);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
@@ -232,15 +475,25 @@ bool CMarketOrder::Modify(ulong ticket, uint stoploss = 0, uint takeprofit = 0)
|
||||
//there's no change in SL or TP - do nothing!
|
||||
if (priceSL == PositionGetDouble(POSITION_SL)
|
||||
&& priceTP == PositionGetDouble(POSITION_TP))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToModifyPosition(symbol,ticket,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to modify: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to modify position
|
||||
result = ctrade.PositionModify(symbol,priceSL,priceTP);
|
||||
if(_IsNettingAccount())
|
||||
result = ctrade.PositionModify(symbol,priceSL,priceTP);
|
||||
else
|
||||
result = ctrade.PositionModify(ticket,priceSL,priceTP);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -263,21 +516,167 @@ bool CMarketOrder::Modify(ulong ticket, double priceSL=0,double priceTP=0)
|
||||
return false;
|
||||
|
||||
string symbol = PositionGetString(POSITION_SYMBOL);
|
||||
double price = PositionGetDouble(POSITION_PRICE_CURRENT);
|
||||
double _point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
double price = PositionGetDouble(POSITION_PRICE_OPEN);
|
||||
//double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
|
||||
//there's no change in SL or TP - do nothing!
|
||||
if (priceSL == PositionGetDouble(POSITION_SL)
|
||||
&& priceTP == PositionGetDouble(POSITION_TP))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToModifyPosition(symbol,ticket,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to modify: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to modify position
|
||||
result = ctrade.PositionModify(symbol,priceSL,priceTP);
|
||||
if(_IsNettingAccount())
|
||||
result = ctrade.PositionModify(symbol,priceSL,priceTP);
|
||||
else
|
||||
result = ctrade.PositionModify(ticket,priceSL,priceTP);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!RetryOrderRequest(++counter))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::ModifyPending(ulong ticket, double entry, bool stopsInPips = true, int stoploss = -1, int takeprofit = -1, ENUM_ORDER_TYPE_TIME orderTypeTime = ORDER_TIME_GTC, datetime expires = 0)
|
||||
{
|
||||
if(!OrderSelect(ticket))
|
||||
return false;
|
||||
|
||||
string symbol = OrderGetString(ORDER_SYMBOL);
|
||||
double point = SymbolInfoDouble(symbol,SYMBOL_POINT);
|
||||
if(entry == 0)
|
||||
entry = OrderGetDouble(ORDER_PRICE_OPEN);
|
||||
|
||||
double priceSL;
|
||||
double priceTP;
|
||||
|
||||
if((OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_LIMIT) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP_LIMIT))
|
||||
{
|
||||
priceSL = (stoploss < 0)
|
||||
? OrderGetDouble(ORDER_SL)
|
||||
: (stoploss == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,entry - stoploss*point);
|
||||
|
||||
priceTP = (takeprofit < 0)
|
||||
? OrderGetDouble(ORDER_TP)
|
||||
: (takeprofit == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,entry + takeprofit*point);
|
||||
}
|
||||
else if((OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP) ||
|
||||
(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP_LIMIT))
|
||||
{
|
||||
priceSL = (stoploss < 0)
|
||||
? OrderGetDouble(ORDER_SL)
|
||||
: (stoploss == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,entry + stoploss*point);
|
||||
|
||||
priceTP = (takeprofit < 0)
|
||||
? OrderGetDouble(ORDER_TP)
|
||||
: (takeprofit == 0)
|
||||
? 0
|
||||
: NormalizePrice(symbol,entry - takeprofit*point);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
//there's no change in parameters - do nothing!
|
||||
if (priceSL == OrderGetDouble(ORDER_SL)
|
||||
&& priceTP == OrderGetDouble(ORDER_TP)
|
||||
&& entry == OrderGetDouble(ORDER_PRICE_OPEN)
|
||||
&& orderTypeTime == OrderGetInteger(ORDER_TYPE_TIME)
|
||||
&& expires == OrderGetInteger(ORDER_TIME_EXPIRATION))
|
||||
return false;
|
||||
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToModifyOrder(symbol,ticket,entry,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to modify: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to modify position
|
||||
result = ctrade.OrderModify(ticket,entry,priceSL,priceTP,orderTypeTime,expires);
|
||||
|
||||
if(result)
|
||||
{
|
||||
Sleep(500);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!RetryOrderRequest(++counter))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CMarketOrder::ModifyPending(ulong ticket, double entry, double priceSL=0, double priceTP=0, ENUM_ORDER_TYPE_TIME orderTypeTime = ORDER_TIME_GTC, datetime expires = 0)
|
||||
{
|
||||
if(!OrderSelect(ticket))
|
||||
return false;
|
||||
|
||||
string symbol = OrderGetString(ORDER_SYMBOL);
|
||||
if(entry == 0)
|
||||
entry = OrderGetDouble(ORDER_PRICE_OPEN);
|
||||
|
||||
//there's no change in parameters - do nothing!
|
||||
if (priceSL == OrderGetDouble(ORDER_SL)
|
||||
&& priceTP == OrderGetDouble(ORDER_TP)
|
||||
&& entry == OrderGetDouble(ORDER_PRICE_OPEN)
|
||||
&& orderTypeTime == OrderGetInteger(ORDER_TYPE_TIME)
|
||||
&& expires == OrderGetInteger(ORDER_TIME_EXPIRATION))
|
||||
return false;
|
||||
|
||||
bool result = false;
|
||||
int counter = 0;
|
||||
|
||||
while(!IsStopped() && !result)
|
||||
{
|
||||
//do checks
|
||||
if(!tradingChecks.OkToModifyOrder(symbol,ticket,entry,priceSL,priceTP))
|
||||
{
|
||||
Alert("Unable to modify: "+tradingChecks.GetCheckErrorToString());
|
||||
return false;
|
||||
}
|
||||
|
||||
//attempt to modify position
|
||||
result = ctrade.OrderModify(ticket,entry,priceSL,priceTP,orderTypeTime,expires);
|
||||
|
||||
if(result)
|
||||
{
|
||||
@@ -350,6 +749,11 @@ bool CMarketOrder::ClosePartial(ulong ticket, double lots)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMarketOrder::Delete(ulong ticket)
|
||||
{
|
||||
return ctrade.OrderDelete(ticket);
|
||||
}
|
||||
|
||||
bool CMarketOrder::Reverse(ulong ticket,double lots = 0, uint stoploss=0, uint takeprofit=0)
|
||||
{
|
||||
if(!PositionSelectByTicket(ticket))
|
||||
@@ -420,6 +824,44 @@ bool CMarketOrder::IsOpen(ulong &ticket, string symbol, long magicNumber = 0)
|
||||
return this._IsOpen(ticket,symbol,magicNumber);
|
||||
}
|
||||
|
||||
bool CMarketOrder::CloseAll(string symbol = "")
|
||||
{
|
||||
int positions=PositionsTotal();
|
||||
ulong ticketsToClose[];
|
||||
int ticketsToCloseCounter = 0;
|
||||
|
||||
if(positions > 0)
|
||||
ArrayResize(ticketsToClose,positions);
|
||||
else
|
||||
return false;
|
||||
|
||||
for(int i=0;i<positions;i++)
|
||||
{
|
||||
// ResetLastError();
|
||||
ulong _ticket=PositionGetTicket(i);
|
||||
if(_ticket!=0)
|
||||
{
|
||||
if(PositionSelectByTicket(_ticket))
|
||||
{
|
||||
if((PositionGetString(POSITION_SYMBOL) == symbol) || (symbol == ""))
|
||||
{
|
||||
ticketsToClose[ticketsToCloseCounter] = _ticket;
|
||||
ticketsToCloseCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ArrayResize(ticketsToClose,ticketsToCloseCounter);
|
||||
for(int i=0;i<ticketsToCloseCounter;i++)
|
||||
{
|
||||
this.Close(ticketsToClose[i]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMarketOrder::IsOpen(ulong &ticket,ENUM_POSITION_TYPE &type,string symbol,long magicNumber=0)
|
||||
{
|
||||
int positions=PositionsTotal();
|
||||
@@ -458,6 +900,15 @@ bool CMarketOrder::IsOpen(ulong &ticket,ENUM_POSITION_TYPE &type,string symbol,l
|
||||
|
||||
}
|
||||
|
||||
bool CMarketOrder::GetPositionType(ulong ticket, ENUM_POSITION_TYPE &_pType)
|
||||
{
|
||||
if(!PositionSelectByTicket(ticket))
|
||||
return false;
|
||||
|
||||
_pType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMarketOrder::_IsOpen(ulong &ticket, string symbol, ENUM_POSITION_TYPE type, long magicNumber)
|
||||
{
|
||||
int positions=PositionsTotal();
|
||||
@@ -546,8 +997,43 @@ string CMarketOrder::PositionTypeToString(ENUM_POSITION_TYPE t)
|
||||
return "-";
|
||||
}
|
||||
|
||||
string CMarketOrder::OrderTypeToString(ENUM_ORDER_TYPE t)
|
||||
{
|
||||
if(t == ORDER_TYPE_BUY)
|
||||
return "Buy";
|
||||
else if(t == ORDER_TYPE_BUY_LIMIT)
|
||||
return "Buy Limit";
|
||||
else if(t == ORDER_TYPE_BUY_STOP)
|
||||
return "Buy Stop";
|
||||
else if(t == ORDER_TYPE_BUY_STOP_LIMIT)
|
||||
return "Buy Stop Limit";
|
||||
else if(t == ORDER_TYPE_SELL)
|
||||
return "Sell";
|
||||
else if(t == ORDER_TYPE_SELL_LIMIT)
|
||||
return "Sell Limit";
|
||||
else if(t == ORDER_TYPE_SELL_STOP)
|
||||
return "Sell Stop";
|
||||
else if(t == ORDER_TYPE_SELL_STOP_LIMIT)
|
||||
return "Sell Stop Limit";
|
||||
else
|
||||
return "-";
|
||||
}
|
||||
|
||||
ENUM_ORDER_TYPE CMarketOrder::TradeBias(ENUM_ORDER_TYPE t)
|
||||
{
|
||||
if((t == ORDER_TYPE_BUY) ||
|
||||
(t == ORDER_TYPE_BUY_LIMIT) ||
|
||||
(t == ORDER_TYPE_BUY_STOP) ||
|
||||
(t == ORDER_TYPE_BUY_STOP_LIMIT))
|
||||
return ORDER_TYPE_BUY;
|
||||
else
|
||||
return ORDER_TYPE_SELL;
|
||||
}
|
||||
|
||||
bool CMarketOrder::RetryOrderRequest(int retryNumber)
|
||||
{
|
||||
Print(ctrade.ResultRetcodeDescription());
|
||||
|
||||
if(retryNumber >= this.numberOfRetries)
|
||||
{
|
||||
PrintFormat("Giving up on maximum number of retries (%d)",this.numberOfRetries);
|
||||
@@ -575,37 +1061,16 @@ bool CMarketOrder::RetryOrderRequest(int retryNumber)
|
||||
break;
|
||||
|
||||
default:
|
||||
MessageBox(ctrade.ResultRetcodeDescription(),"Operation failed",MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Normalizing |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
double NormalizeLots(string symbol, double InputLots)
|
||||
void CMarketOrder::SetTradeId(ulong tradeId)
|
||||
{
|
||||
double lotsMin = SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
|
||||
double lotsMax = SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
|
||||
int lotsDigits = (int) - MathLog10(SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP));
|
||||
|
||||
if(InputLots < lotsMin)
|
||||
InputLots = lotsMin;
|
||||
if(InputLots > lotsMax)
|
||||
InputLots = lotsMax;
|
||||
|
||||
return NormalizeDouble(InputLots, lotsDigits);
|
||||
ctrade.SetExpertMagicNumber(tradeId);
|
||||
}
|
||||
|
||||
double NormalizePrice(string symbol, double price, double tick = 0)
|
||||
{
|
||||
double _tick = tick ? tick : SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
|
||||
int _digits = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
|
||||
|
||||
if (tick)
|
||||
return NormalizeDouble(MathRound(price/_tick)*_tick,_digits);
|
||||
else
|
||||
return NormalizeDouble(price,_digits);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user