Ten*_*Ten 7 trading algorithmic-trading metatrader4 mql4
我想另一个条件添加到该解决方案在这个岗位。我希望当交易获利10点时,止损将增加10点。更具体地说,假设我已经设置了一个待处理的买单,止损位比开盘价低10点,止盈位为50点。如果交易获利10个点,那么止损将向上移动10个点,如果交易获利为20个点,则止损将向上移动另一个10个点,而当交易获利30和40个点时,同样会发生直到达到50点止盈为止。这里的想法是,止损会增加10个点,而利润会增加10个点,但是止损不会下降。因此,如果止损为获利10个点,而价格为获利23个点并且突然下降,它将以10个止损获利退出交易。
设置以上条件对我来说似乎很复杂。我还没完成。
以下是我要解决的代码的相关部分(请注意,其余代码与上述链接的问题解决方案相同)。
//=========================================================
//CLOSE EXPIRED STOP/EXECUTED ORDERS
//---------------------------------------------------------
for( int i=OrdersTotal()-1; i>=0; i-- ) {
if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES ))
if( OrderSymbol() == Symbol() )
if( OrderMagicNumber() == viMagicId) {
if( (OrderType() == OP_BUYSTOP) || (OrderType() == OP_SELLSTOP) )
if((TimeCurrent()-OrderOpenTime()) >= viDeleteStopOrderAfterInSec)
OrderDelete(OrderTicket());
if( (OrderType() == OP_BUY) || (OrderType() == OP_SELL) )
if((TimeCurrent()-OrderOpenTime()) >= viDeleteOpenOrderAfterInSec) {
// For executed orders, need to close them
double closePrice = 0;
RefreshRates();
if(OrderType() == OP_BUY)
closePrice = Bid;
if(OrderType() == OP_SELL)
closePrice = Ask;
OrderClose(OrderTicket(), OrderLots(), closePrice, int(viMaxSlippageInPip*viPipsToPoint), clrWhite);
}
// WORKING ON 10 pip Gap for to increase stop loss by 10 pips as profits increase by 10 pips
int incomePips = (int) ((OrderProfit() - OrderSwap() - OrderCommission()) / OrderLots());
if (incomePips >= 10) {
if(OrderType() == OP_BUY)
OrderModify(OrderTicket(), 0, OrderStopLoss() + 10*Point, OrderTakeProfit(), 0);
if(OrderType() == OP_SELL)
OrderModify(OrderTicket(), 0, OrderStopLoss() - 10*Point, OrderTakeProfit(), 0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
BLOCK-TRAILING 您正在寻找的称为 Block-Trailing。与 MT4 附带的普通追踪止损不同,您(将)需要:
注意:随之而来的一个常见问题是交易者将轨迹设置得太接近/太接近当前市场。MT4 不是高频交易平台。不要将其剥得太近。大多数经纪商都有最小冻结和止损距离。如果您将其设置得太接近价格边缘,您将收到“ERROR 130 Invalid Stop”错误。检查经纪商在合约规范中的符号设置。
参数
vsTicketIdsInCSV:要处理的打开的 TicketID 列表(例如 123、124、123123、1231、1)
viProfitToActivateBlockTrailInPip:追踪仅在 OrderProfit > 此点后开始。
viTrailShiftProfitBlockInPip:每当利润增加此点数时,止损就会跳动。
viTrailShiftOnProfitInPip:将止损增加此点数。
例子:
viProfitToActivateBlockTrailInPip=100,viTrailShiftProfitBlockInPip=30,viTrailShiftOnProfitInPip=20。
当订单浮动利润 130 点 (100+30) 时,区块追踪将开始。止损将设置为保证 20 点利润。
当浮动利润达到160pips(100+30+30)时,止损将设置为保证40pips(2x20pips)。
我已将其添加到 GitHub: https: //github.com/fhlee74/mql4-BlockTrailer 如果您有 ETH 或 BTC 贡献,我们将不胜感激。
这是它的完整代码:
//+------------------------------------------------------------------+
//| SO56177003.mq4 |
//| Copyright 2019, Joseph Lee, TELEGRAM @JosephLee74 |
//| http://www.fs.com.my |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Joseph Lee, TELEGRAM @JosephLee74"
#property link "http://www.fs.com.my"
#property version "1.00"
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>
//-------------------------------------------------------------------
// APPLICABLE PARAMETERS
//-------------------------------------------------------------------
extern string vsEAComment1 = "Telegram @JosephLee74"; // Ego trip
extern string vsTicketIdsInCSV = "123 , 124, 125 ,126 "; // List of OPENED TicketIDs to process.
extern int viProfitToActivateBlockTrailInPip = 10; // Order must be in profit by this to activate BlockTrail
extern int viTrailShiftProfitBlockInPip = 15; // For every pip in profit (Profit Block), shift the SL
extern int viTrailShiftOnProfitInPip = 10; // by this much
extern int viMaxSlippageInPip = 2; // Max Slippage (pip)
//-------------------------------------------------------------------
// System Variables
//-------------------------------------------------------------------
double viPipsToPrice = 0.0001;
double viPipsToPoint = 1;
int vaiTicketIds[];
string vsDisplay = "";
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| EA Initialization function
//+------------------------------------------------------------------+
int init() {
ObjectsDeleteAll(); Comment("");
// Caclulate PipsToPrice & PipsToPoints (old sytle, but works)
if((Digits == 2) || (Digits == 3)) {viPipsToPrice=0.01;}
if((Digits == 3) || (Digits == 5)) {viPipsToPoint=10;}
// ---------------------------------
// Transcribe the list of TicketIDs from CSV (comma separated string) to an Int array.
string vasTickets[];
StringSplit(vsTicketIdsInCSV, StringGetCharacter(",", 0), vasTickets);
ArrayResize(vaiTicketIds, ArraySize(vasTickets));
for(int i=0; i<ArraySize(vasTickets); i++) {
vaiTicketIds[i] = StringToInteger(StringTrimLeft(StringTrimRight(vasTickets[i])));
}
// ---------------------------------
start();
return(0);
}
//+------------------------------------------------------------------+
//| EA Stand-Down function
//+------------------------------------------------------------------+
int deinit() {
ObjectsDeleteAll();
return(0);
}
//============================================================
// MAIN EA ROUTINE
//============================================================
int start() {
// ========================================
// Process all the tickets in the list
vsDisplay = "BLOCK-TRAILER v1.1 (Please note the Minimum Freeze/StopLoss level in Contract Specification to AVOID error 130 Invalid Stop when trailing).\n";
double viPrice = 0;
for(int i=0; i<ArraySize(vaiTicketIds); i++) {
if(OrderSelect( vaiTicketIds[i], SELECT_BY_TICKET, MODE_TRADES ))
if(OrderCloseTime() == 0 ) {
// Only work on Active orders
if(OrderType() == OP_BUY) {
RefreshRates();
double viCurrentProfitInPip = (Bid-OrderOpenPrice()) / viPipsToPrice;
double viNewSLinPip = ((viCurrentProfitInPip - viProfitToActivateBlockTrailInPip)/viTrailShiftProfitBlockInPip) * viTrailShiftOnProfitInPip;
double viSLinPrice = NormalizeDouble(OrderOpenPrice() + (viNewSLinPip * viPipsToPrice), Digits);
double viNewSLFromCurrentPrice = NormalizeDouble((Bid-viSLinPrice)/viPipsToPrice, 1);
vsDisplay = vsDisplay
+ "\n[" + IntegerToString(OrderTicket())
+ "] BUY: Open@ " + DoubleToStr(OrderOpenPrice(), Digits)
+ " | P/L: $" + DoubleToStr(OrderProfit(), 2)
+ " / " + DoubleToStr(viCurrentProfitInPip, 1) + "pips.";
if(viCurrentProfitInPip < (viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip))
vsDisplay = vsDisplay + " " + int(((viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip))-viCurrentProfitInPip) + " pips to start Trail.";
if(viCurrentProfitInPip >= (viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip)) {
ResetLastError();
vsDisplay = vsDisplay + " TRAILING to [" + DoubleToStr(viSLinPrice, Digits) + " which is " + DoubleToStr(viNewSLFromCurrentPrice, 1) + " pips from Bid]";
if((viSLinPrice > OrderStopLoss()) || (OrderStopLoss() == 0))
if(OrderModify(OrderTicket(), OrderOpenPrice(), viSLinPrice, OrderTakeProfit(), OrderExpiration())) {
vsDisplay = vsDisplay + " --Trailed SL to " + DoubleToStr(viSLinPrice, Digits);
}
else {
int errCode = GetLastError();
Print(" --ERROR Trailing " + IntegerToString(OrderTicket()) + " to " + DoubleToStr(viSLinPrice, Digits) + ". [" + errCode + "]: " + ErrorDescription(errCode));
vsDisplay = vsDisplay + " --ERROR Trailing to " + DoubleToStr(viSLinPrice, Digits);
vsDisplay = vsDisplay + " [" + errCode + "]: " + ErrorDescription(errCode);
}
}
}
if(OrderType() == OP_SELL) {
RefreshRates();
double viCurrentProfitInPip = (OrderOpenPrice()-Ask) / viPipsToPrice;
double viNewSLinPip = int((viCurrentProfitInPip - viProfitToActivateBlockTrailInPip)/viTrailShiftProfitBlockInPip) * viTrailShiftOnProfitInPip;
double viSLinPrice = NormalizeDouble(OrderOpenPrice() - (viNewSLinPip * viPipsToPrice), Digits);
double viNewSLFromCurrentPrice = NormalizeDouble((viSLinPrice-Ask)/viPipsToPrice, 1);
vsDisplay = vsDisplay
+ "\n[" + IntegerToString(OrderTicket())
+ "] SELL: Open@ " + DoubleToStr(OrderOpenPrice(), Digits)
+ " | P/L: $" + DoubleToStr(OrderProfit(), 2)
+ " / " + DoubleToStr(viCurrentProfitInPip, 1) + "pips.";
if(viCurrentProfitInPip < (viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip))
vsDisplay = vsDisplay + " " + int(((viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip))-viCurrentProfitInPip) + " pips to start Trail.";
if(viCurrentProfitInPip >= (viProfitToActivateBlockTrailInPip+viTrailShiftProfitBlockInPip)) {
ResetLastError();
vsDisplay = vsDisplay + " TRAILING to [" + DoubleToStr(viSLinPrice, Digits) + " which is " + DoubleToStr(viNewSLFromCurrentPrice, 1) + " pips from Ask]";
if((viSLinPrice < OrderStopLoss()) || (OrderStopLoss()==0) )
if(OrderModify(OrderTicket(), OrderOpenPrice(), viSLinPrice, OrderTakeProfit(), OrderExpiration())) {
vsDisplay = vsDisplay + " --Trailed SL to " + DoubleToStr(viSLinPrice, Digits);
}
else {
int errCode = GetLastError();
Print(" --ERROR Trailing " + IntegerToString(OrderTicket()) + " to " + DoubleToStr(viSLinPrice, Digits) + ". [" + errCode + "]: " + ErrorDescription(errCode));
vsDisplay = vsDisplay + " --ERROR Trailing to " + DoubleToStr(viSLinPrice, Digits);
vsDisplay = vsDisplay + " [" + errCode + "]: " + ErrorDescription(errCode);
}
}
}
}
}
Comment(vsDisplay);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
267 次 |
最近记录: |