KANOK_ea

KANOK_ea最新版

官方版无广告231

更新日期:2022-03-15分类标签: 语言:中文平台:没限制

36 人已下载 手机查看

//+——————————————————————+
//| KANOK EA(barabashkakvn’s edition).mq5 |
//| Copyright 2005, ZEPATRADER Software Corp. |
//| |
//+——————————————————————+
#property copyright “Copyright 2005, ZEPATRADER Software Corp.”

#property version “1”
//—
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//— input parameters
input double InpLots = 0.1; // Lots
input ushort InpStopLossBuy = 40; // Stop Loss BUY (in pips)
input ushort InpTakeProfitBuy = 70; // Take Profit BUY (in pips)
input ushort InpStopLossSell = 10; // Stop Loss SELL (in pips)
input ushort InpTakeProfitSell = 40; // Take Profit SELL (in pips)
input ushort InpTrailingStop = 5; // Trailing Stop (min distance from price to Stop Loss) (in pips)
input ushort InpTrailingStep = 1; // Trailing Step (in pips)
input double Sto_level_buy = 37.0; // Stochastic level BUY (if Sto < level -> signal BUY)
input double Sto_level_sell = 96.0; // Stochastic level SELL (if Sto > level -> signal SELL)
input ENUM_TIMEFRAMES Work_timeframe=PERIOD_M3; // Work timeframe
//— MACD
input ENUM_TIMEFRAMES MACD_timeframe = PERIOD_M12; // MACD: timeframe
input int MACD_signal_period = 9; // MACD: period for their difference averaging
input int MACD_fast_ema_period = 12; // MACD: period for Fast average calculation
input int MACD_slow_ema_period = 26; // MACD: period for Slow average calculation
input ENUM_APPLIED_PRICE MACD_applied_price = PRICE_CLOSE; // MACD: type of price
//— Stochastic
input ENUM_TIMEFRAMES Sto_timeframe = PERIOD_H1; // Stochastic: timeframe
input int Sto_Kperiod = 5; // Stochastic: K-period (number of bars for calculations)
input int Sto_Dperiod = 3; // Stochastic: D-period (period of first smoothing)
input int Sto_slowing = 3; // Stochastic: final smoothing
input ENUM_MA_METHOD Sto_ma_method = MODE_EMA; // Stochastic: type of smoothing
input ENUM_STO_PRICE Sto_price_field = STO_LOWHIGH; // Stochastic: stochastic calculation method
//—
input ulong m_magic=39427905; // magic number
//—
ulong m_slippage=10; // slippage

double ExtStopLossBuy=0.0;
double ExtTakeProfitBuy=0.0;
double ExtStopLossSell=0.0;
double ExtTakeProfitSell=0.0;
double ExtTrailingStop=0.0;
double ExtTrailingStep=0.0;

int handle_iMACD; // variable for storing the handle of the iMACD indicator
int handle_iStochastic; // variable for storing the handle of the iStochastic indicator

double m_adjusted_point; // point value adjusted for 3 or 5 points
//—
double macd_one[];
double sto_one[];
MqlRates rates[];
//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
ArraySetAsSeries(macd_one,true);
ArraySetAsSeries(sto_one,true);
ArraySetAsSeries(rates,true);
//—
if(InpTrailingStop!=0 && InpTrailingStep==0)
{
string text=(TerminalInfoString(TERMINAL_LANGUAGE)==”Russian”)?
“Трейлинг невозможен: параметр \”Trailing Step\” равен нулю!”:
“Trailing is not possible: parameter \”Trailing Step\” is zero!”;
Alert(__FUNCTION__,” ERROR! “,text);
return(INIT_PARAMETERS_INCORRECT);
}
//—
if(!m_symbol.Name(Symbol())) // sets symbol name
return(INIT_FAILED);
RefreshRates();

string err_text=””;
if(!CheckVolumeValue(InpLots,err_text))
{
Print(__FUNCTION__,”, ERROR: “,err_text);
return(INIT_PARAMETERS_INCORRECT);
}
//—
m_trade.SetExpertMagicNumber(m_magic);
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(m_symbol.Name());
m_trade.SetDeviationInPoints(m_slippage);
//— tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;

ExtStopLossBuy = InpStopLossBuy * m_adjusted_point;
ExtTakeProfitBuy = InpTakeProfitBuy * m_adjusted_point;
ExtStopLossSell = InpStopLossSell * m_adjusted_point;
ExtTakeProfitSell = InpTakeProfitSell * m_adjusted_point;
ExtTrailingStop = InpTrailingStop * m_adjusted_point;
ExtTrailingStep = InpTrailingStep * m_adjusted_point;
//— create handle of the indicator iMACD
handle_iMACD=iMACD(m_symbol.Name(),MACD_timeframe,MACD_fast_ema_period,
MACD_slow_ema_period,MACD_signal_period,MACD_applied_price);
//— if the handle is not created
if(handle_iMACD==INVALID_HANDLE)
{
//— tell about the failure and output the error code
PrintFormat(“Failed to create handle of the iMACD indicator for the symbol %s/%s, error code %d”,
m_symbol.Name(),
EnumToString(MACD_timeframe),
GetLastError());
//— the indicator is stopped early
return(INIT_FAILED);
}
//— create handle of the indicator iStochastic
handle_iStochastic=iStochastic(m_symbol.Name(),Sto_timeframe,
Sto_Kperiod,Sto_Dperiod,Sto_slowing,
Sto_ma_method,Sto_price_field);
//— if the handle is not created
if(handle_iStochastic==INVALID_HANDLE)
{
//— tell about the failure and output the error code
PrintFormat(“Failed to create handle of the iStochastic indicator for the symbol %s/%s, error code %d”,
m_symbol.Name(),
EnumToString(Sto_timeframe),
GetLastError());
//— the indicator is stopped early
return(INIT_FAILED);
}
//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| Expert deinitialization function |
//+——————————————————————+
void OnDeinit(const int reason)
{
//—

}
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
{
Trailing();
//— we work only at the time of the birth of new bar
static datetime PrevBars=0;
datetime time_0=iTime(m_symbol.Name(),Work_timeframe,0);
if(time_0==PrevBars)
return;
PrevBars=time_0;
//—
if(!iMACDGetArray(MAIN_LINE,0,2,macd_one) ||
!iStochasticGetArray(MAIN_LINE,0,2,sto_one) ||
CopyRates(m_symbol.Name(),Work_timeframe,0,2,rates)!=2)
{
PrevBars=0;
return;
}
//—
if(macd_one[0]>macd_one[1] && macd_one[1]<0.0 && sto_one[0]<Sto_level_buy && sto_one[0]>sto_one[1])
{
if(!RefreshRates())
{
PrevBars=0;
return;
}
double sl=(InpStopLossBuy==0)?0.0:m_symbol.Ask()-ExtStopLossBuy;
if(sl>=m_symbol.Bid()) // incident: the position isn’t opened yet, and has to be already closed
{
PrevBars=0;
return;
}
double tp=(InpTakeProfitBuy==0)?0.0:m_symbol.Ask()+ExtTakeProfitBuy;
OpenBuy(sl,tp);
//—
return;
}
if(macd_one[0]<macd_one[1] && macd_one[1]>0.0 && sto_one[0]>Sto_level_sell && sto_one[0]<sto_one[1])
{
if(!RefreshRates())
{
PrevBars=0;
return;
}
double sl=(InpStopLossSell==0)?0.0:m_symbol.Bid()+ExtStopLossSell;
if(sl<=m_symbol.Ask()) // incident: the position isn’t opened yet, and has to be already closed
{
PrevBars=0;
return;
}
double tp=(InpTakeProfitSell==0)?0.0:m_symbol.Bid()-ExtTakeProfitSell;
OpenSell(sl,tp);
//—
return;
}
}
//+——————————————————————+
//| TradeTransaction function |
//+——————————————————————+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//—

}
//+——————————————————————+
//| Refreshes the symbol quotes data |
//+——————————————————————+
bool RefreshRates(void)
{
//— refresh rates
if(!m_symbol.RefreshRates())
{
Print(“RefreshRates error”);
return(false);
}
//— protection against the return value of “zero”
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//—
return(true);
}
//+——————————————————————+
//| Check the correctness of the position volume |
//+——————————————————————+
bool CheckVolumeValue(double volume,string &error_description)
{
//— minimal allowed volume for trade operations
double min_volume=m_symbol.LotsMin();
if(volume<min_volume)
{
if(TerminalInfoString(TERMINAL_LANGUAGE)==”Russian”)
error_description=StringFormat(“Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f”,min_volume);
else
error_description=StringFormat(“Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f”,min_volume);
return(false);
}
//— maximal allowed volume of trade operations
double max_volume=m_symbol.LotsMax();
if(volume>max_volume)
{
if(TerminalInfoString(TERMINAL_LANGUAGE)==”Russian”)
error_description=StringFormat(“Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f”,max_volume);
else
error_description=StringFormat(“Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f”,max_volume);
return(false);
}
//— get minimal step of volume changing
double volume_step=m_symbol.LotsStep();
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
if(TerminalInfoString(TERMINAL_LANGUAGE)==”Russian”)
error_description=StringFormat(“Объем не кратен минимальному шагу SYMBOL_VOLUME_STEP=%.2f, ближайший правильный объем %.2f”,
volume_step,ratio*volume_step);
else
error_description=StringFormat(“Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f”,
volume_step,ratio*volume_step);
return(false);
}
error_description=”Correct volume value”;
return(true);
}
//+——————————————————————+
//| Get value of buffers for the iMACD in the array |
//| the buffer numbers are the following: |
//| 0 – MAIN_LINE, 1 – SIGNAL_LINE |
//+——————————————————————+
bool iMACDGetArray(const int buffer,const int start_pos,const int count,double &arr_buffer[])
{
//—
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
Print(“This a no dynamic array!”);
return(false);
}
ArrayFree(arr_buffer);
//— reset error code
ResetLastError();
//— fill a part of the iMABuffer array with values from the indicator buffer that has 0 index
int copied=CopyBuffer(handle_iMACD,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//— if the copying fails, tell the error code
PrintFormat(“Failed to copy data from the iMACD indicator, error code %d”,GetLastError());
//— quit with zero result – it means that the indicator is considered as not calculated
return(false);
}
//—
return(result);
}
//+——————————————————————+
//| Get value of buffers for the iStochastic |
//| the buffer numbers are the following: |
//| 0 – MAIN_LINE, 1 – SIGNAL_LINE |
//+——————————————————————+
bool iStochasticGetArray(const int buffer,const int start_pos,const int count,double &arr_buffer[])
{
if(!ArrayIsDynamic(arr_buffer))
{
Print(“This a no dynamic array!”);
return(false);
}
ArrayFree(arr_buffer);
//— reset error code
ResetLastError();
//— fill a part of the iStochastic array with values from the indicator buffer that has 0 index
int copy_buffer=CopyBuffer(handle_iStochastic,buffer,start_pos,count,arr_buffer);
if(copy_buffer!=count)
{
//— if the copying fails, tell the error code
PrintFormat(“Failed to copy data from the iStochastic indicator, error code %d”,GetLastError());
//— quit with false result – it means that the indicator is considered as not calculated
return(false);
}
//—
return(true);
}
//+——————————————————————+
//| Is position exists |
//+——————————————————————+
bool IsPositionExists(void)
{
for(int i=PositionsTotal()-1;i>=0;i–)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
return(true);
//—
return(false);
}
//+——————————————————————+
//| Open Buy position |
//+——————————————————————+
void OpenBuy(double sl,double tp)
{
sl=m_symbol.NormalizePrice(sl);
tp=m_symbol.NormalizePrice(tp);
//— check volume before OrderSend to avoid “not enough money” error (CTrade)
double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),InpLots,m_symbol.Ask(),ORDER_TYPE_BUY);

if(check_volume_lot!=0.0)
{
if(check_volume_lot>=InpLots)
{
if(m_trade.Buy(InpLots,m_symbol.Name(),m_symbol.Ask(),sl,tp))
{
if(m_trade.ResultDeal()==0)
{
Print(__FUNCTION__,”, #1 Buy -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
else
{
Print(__FUNCTION__,”, #2 Buy -> true. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
}
else
{
Print(__FUNCTION__,”, #3 Buy -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
}
else
{
Print(__FUNCTION__,”, ERROR: method CheckVolume (“,DoubleToString(check_volume_lot,2),”) “,
“< Lots (“,DoubleToString(InpLots,2),”)”);
return;
}
}
else
{
Print(__FUNCTION__,”, ERROR: method CheckVolume returned the value of \”0.0\””);
return;
}
//—
}
//+——————————————————————+
//| Open Sell position |
//+——————————————————————+
void OpenSell(double sl,double tp)
{
sl=m_symbol.NormalizePrice(sl);
tp=m_symbol.NormalizePrice(tp);
//— check volume before OrderSend to avoid “not enough money” error (CTrade)
double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),InpLots,m_symbol.Bid(),ORDER_TYPE_SELL);

if(check_volume_lot!=0.0)
{
if(check_volume_lot>=InpLots)
{
if(m_trade.Sell(InpLots,m_symbol.Name(),m_symbol.Bid(),sl,tp))
{
if(m_trade.ResultDeal()==0)
{
Print(__FUNCTION__,”, #1 Sell -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
else
{
Print(__FUNCTION__,”, #2 Sell -> true. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
}
else
{
Print(__FUNCTION__,”, #3 Sell -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
PrintResultTrade(m_trade,m_symbol);
}
}
else
{
Print(__FUNCTION__,”, ERROR: method CheckVolume (“,DoubleToString(check_volume_lot,2),”) “,
“< Lots (“,DoubleToString(InpLots,2),”)”);
return;
}
}
else
{
Print(__FUNCTION__,”, ERROR: method CheckVolume returned the value of \”0.0\””);
return;
}
//—
}
//+——————————————————————+
//| Print CTrade result |
//+——————————————————————+
void PrintResultTrade(CTrade &trade,CSymbolInfo &symbol)
{
Print(“File: “,__FILE__,”, symbol: “,m_symbol.Name());
Print(“Code of request result: “+IntegerToString(trade.ResultRetcode()));
Print(“code of request result as a string: “+trade.ResultRetcodeDescription());
Print(“Deal ticket: “+IntegerToString(trade.ResultDeal()));
Print(“Order ticket: “+IntegerToString(trade.ResultOrder()));
Print(“Volume of deal or order: “+DoubleToString(trade.ResultVolume(),2));
Print(“Price, confirmed by broker: “+DoubleToString(trade.ResultPrice(),symbol.Digits()));
Print(“Current bid price: “+DoubleToString(symbol.Bid(),symbol.Digits())+” (the requote): “+DoubleToString(trade.ResultBid(),symbol.Digits()));
Print(“Current ask price: “+DoubleToString(symbol.Ask(),symbol.Digits())+” (the requote): “+DoubleToString(trade.ResultAsk(),symbol.Digits()));
Print(“Broker comment: “+trade.ResultComment());
}
//+——————————————————————+
//| Trailing |
//| InpTrailingStop: min distance from price to Stop Loss |
//+——————————————————————+
void Trailing()
{
if(InpTrailingStop==0)
return;
for(int i=PositionsTotal()-1;i>=0;i–) // returns the number of open positions
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop),
m_position.TakeProfit()))
Print(“Modify “,m_position.Ticket(),
” Position -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
RefreshRates();
m_position.SelectByIndex(i);
PrintResultModify(m_trade,m_symbol,m_position);
continue;
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop),
m_position.TakeProfit()))
Print(“Modify “,m_position.Ticket(),
” Position -> false. Result Retcode: “,m_trade.ResultRetcode(),
“, description of result: “,m_trade.ResultRetcodeDescription());
RefreshRates();
m_position.SelectByIndex(i);
PrintResultModify(m_trade,m_symbol,m_position);
}
}

}
}
//+——————————————————————+
//| Print CTrade result |
//+——————————————————————+
void PrintResultModify(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position)
{
Print(“File: “,__FILE__,”, symbol: “,m_symbol.Name());
Print(“Code of request result: “+IntegerToString(trade.ResultRetcode()));
Print(“code of request result as a string: “+trade.ResultRetcodeDescription());
Print(“Deal ticket: “+IntegerToString(trade.ResultDeal()));
Print(“Order ticket: “+IntegerToString(trade.ResultOrder()));
Print(“Volume of deal or order: “+DoubleToString(trade.ResultVolume(),2));
Print(“Price, confirmed by broker: “+DoubleToString(trade.ResultPrice(),symbol.Digits()));
Print(“Current bid price: “+DoubleToString(symbol.Bid(),symbol.Digits())+” (the requote): “+DoubleToString(trade.ResultBid(),symbol.Digits()));
Print(“Current ask price: “+DoubleToString(symbol.Ask(),symbol.Digits())+” (the requote): “+DoubleToString(trade.ResultAsk(),symbol.Digits()));
Print(“Broker comment: “+trade.ResultComment());
Print(“Price of position opening: “+DoubleToString(position.PriceOpen(),symbol.Digits()));
Print(“Price of position’s Stop Loss: “+DoubleToString(position.StopLoss(),symbol.Digits()));
Print(“Price of position’s Take Profit: “+DoubleToString(position.TakeProfit(),symbol.Digits()));
Print(“Current price by position: “+DoubleToString(position.PriceCurrent(),symbol.Digits()));
}
//+——————————————————————+

如果你对文件有了解,请帮助投票!

If you are familiar with the file, please help vote!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位投票人。

相关资源

暂无评论

暂无评论...
Ads Blocker Image Powered by Code Help Pro

检测到广告拦截程序!!!Ads Blocker Detected!!!

我们检测到您正在使用扩展来屏蔽广告。请通过禁用这些广告屏蔽程序或者把网站加入白名单来支持我们。

We have detected that you are using an extension to block advertisements. Please support us by disabling these advertising blocking programs or adding the website to the whitelist.