请帮助免费编写EA。5个不同的想法。 - 页 15

 

就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。

 
GeneratorID:

就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。


谁会对一辆 "旧自行车 "感兴趣?你 还是没有明白,你想开始探索的东西在论坛里早就没有了,代码库里有免费的实现--看看,玩玩。 你有自己的想法吗?否则就没有什么可讨论的。
 

请帮我将最大未结订单数量添加到顾问!

//+------------------------------------------------ ------------------+

//| v128-2.mq4 |

//|版权所有 © 2011,Andrey N. Bolkonsky |

//| 2011 年 3 月 21 日 |

//|电子邮件:abolk@yandex.ru | Skype: abolk1 |

//+------------------------------------------------ ------------------+

#property 版权所有“版权所有 © 2011,Andrey N. Bolkonsky”

#property 链接“abolk@yandex.ru”


//

extern string rem2 = "=== 手数 ===;

外部双 _Lots0_1 = 0.1; // 基础级别(对于第一个订单)

外部双 _Lots0_2 = 0.1; // 基础级别(对于第二个订单)

//

extern string rem3 = "=== 附加参数 ===";

extern int _TakeProfit1_Proc = 50; // 第一个订单的获利风险百分比

外部 int _SpaseFromMaxMin = 1; // 从顶部/底部偏移

//

extern string rem4 = "=== 盈亏平衡参数 ===";

extern bool _IsStopLoss_0 = false; // 启用盈亏平衡水平

extern int _StopLoss_0_From = 0; // 从盈亏平衡水平偏移(以点为单位)

extern int _StopLoss_0_Level = 15; //盈亏平衡水平

//

extern string rem5 = "=== 追踪止损参数 ===";

extern bool _IsTrailingStop = false; // 启用追踪止损

bool _IsTrailingStopProfit = true; // 从盈亏平衡位置启用追踪止损

//extern int _TrailingStopProfit_From = 0; // 从盈亏平衡水平偏移(以点为单位)

外部 int _TrailingStopLevel = 15; // 追踪止损水平

外部 int _TrailingStopStep = 5; // 追踪止损移动步骤

//

extern string rem6 = "=== 工具设置 ===";

外部字符串 _Symboll = ""; // 工具的符号名称:"" - 当前符号

extern int _Timeframe = 0; // Period: 0 - 当前图表的周期

int_Digitss; // 价格小数点后的位数

双 _Points; // 报价货币的点数

extern int _Slippage = 2; // 滑点

外部 int _Magic1 = 1281; // 唯一数量的 EA 订单(第一个订单)

外部 int _Magic2 = 1282; // 唯一数量的 EA 订单(第二个订单)

//

extern string rem7 = "=== MA1 指标参数 ===;

extern int _MA1_Timeframe = PERIOD_D1; // Period: 0 - 当前图表的周期

extern int _MA1_Period = 20; // 计算移动平均线的平均周期

外部 int _MA1_Shift = 0; // 指标相对于价格图表的偏移

外部 int _MA1_Method = 0; // 平均方法:0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA1_Applied_Price = 0; // 使用价格:0 - 收盘价,1 - 开盘价,2 - 最高价,3 - 最低价

//

extern string rem8 = "=== MA2 指标参数 ===";

extern int _MA2_Timeframe = PERIOD_H4; // Period: 0 - 当前图表的周期

extern int _MA2_Period = 20; // 计算移动平均线的平均周期

外部 int _MA2_Shift = 0; // 指标相对于价格图表的偏移

外部 int _MA2_Method = 0; // 平均方法:0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA

extern int _MA2_Applied_Price = 0; // 使用价格:0 - 收盘价,1 - 开盘价,2 - 最高价,3 - 最低价

//

extern string rem9 = "=== 布林带指标参数 ===";

//extern int _BB_Timeframe = 0; // Period: 0 - 当前图表的周期

extern int _BB_Period = 20; // 主指标线的平均周期

外部 int _BB_Deviation = 2; // 偏离主线

外部 int _BB_Bands_Shift = 0; // 指标相对于价格图表的偏移

extern int _BB_Applied_Price = 0; // 使用价格:0 - 收盘

//

extern string rem10 = "=== ZigZag 指标参数 ===";

//extern int _ZZ_Timeframe = 0; // Period: 0 - 当前图表的周期

外部 int _ZZ_ExtDepth = 12;

外部 int _ZZ_ExtDeviation = 5;

extern int _ZZ_ExtBackstep = 3;

//

datetime_TimePrevious;

日期时间_TimeCurrent;

//

string_fstr;

int_tp;

//




无效 MaxOrders(int max_orders=5);











//=++============================================== ================++=

初始化初始化()

{

if(_Symbol == "") _Symbol = Symbol();

//

_Digitss = MarketInfo(_Symbol, MODE_DIGITS);

_Points = MarketInfo(_Symbol, MODE_POINT);

//

if(_Timeframe == 0) _Timeframe = Period();

Print("v128-2 > init() >> _Timeframe=", _Timeframe,

"rem4=",_IsStopLoss_0,

"rem5=",_IsTrailingStop,_IsTrailingStopProfit);

//

_fstr = "v128_";

_tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // 确保文件存在,如果不存在,则创建它

Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);

//

_TimePrevious=iTime(_Symbol, _Timeframe, 0);

//

Print("v128-2 > 完成:init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");

返回(0);

}



//=++============================================== ================++=

整数开始()

{

双 P_Close1,P_Close2;

双 BB_1_upper,BB_1_lower;

双 MA1_0,MA2_0;

双 P_ask,P_bid;

bool is_signal_2_buy, is_signal_2_sell;

双 P1_buy、P2_buy、P3_buy;

双 P1_sell、P2_sell、P3_sell;

布尔 is_b1 = 假,is_s1 = 假;

布尔 is_b2 = 假,is_s2 = 假;

国际票;

//

_TimeCurrent = iTime(_Symbol, _Timeframe, 0);

如果(_TimeCurrent != _TimePrevious)

{

MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);

MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);

BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);

BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);

P_Close1 = iClose(_Symbol, _Timeframe, 1);

P_Close2 = iClose(_Symbol, _Timeframe, 2);

P_ask = MarketInfo(_Symbol, MODE_ASK);

P_bid = MarketInfo(_Symbol, MODE_BID);

Print("v120-4 > ", _Symbol, " | ", _Timeframe,

" -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,

" -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,

" -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,

" -> ask=", P_ask, " | bid=", P_bid);

//

is_signal_2_buy = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;

is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> is_signal2 -> 购买=", is_signal_2_buy, " | 出售=", is_signal_2_sell);

// ========== 按市场

// ========== 开启买单

如果(is_signal_2_buy)

{

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> 发出开买单的信号");

OrdersDeleteAll(OP_SELL);

//

如果(!is_b1 || !is_b2)

{

P1_buy = P_ask;

P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;

_tp = (P1_buy - P3_buy) / _Point * (_TakeProfit1_Proc / 100.0);

P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);

//

_FileWriteDouble(_fstr+"_tp.dat", _tp);

//

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

“ -> 购买 -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);

//

票 = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),

NULL, _Magic1, 0, CLR_NONE);

如果(票 == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> BUY (1) > 错误(开盘)#", GetLastError());

否则 is_b1 = true;

//

票 = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,

NULL, _Magic2, 0, CLR_NONE);

如果(票 == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> 购买 (2) > 错误(开盘)#", GetLastError());

否则 is_b2 = true;

//

}

否则 { is_b1 = true; is_b2 = 真; }

}

否则 { is_b1 = true; is_b2 = 真; }

//打印("=买+++",is_b1,is_b2,"==",is_s1,is_s2);

// ========== 开卖单

如果(is_signal_2_sell)

{

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> 发出开卖单的信号");

OrdersDeleteAll(OP_BUY);

//

如果(!is_s1 || !is_s2)

{

P1_sell = P_bid;

P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;

_tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);

P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);

//

_FileWriteDouble(_fstr+"_tp.dat", _tp);

//

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

“ -> 买入 -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);

//

票 = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),

NULL, _Magic1, 0, CLR_NONE);

如果(票 == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> SELL (1) > Error (opening) #", GetLastError());

否则 is_s1 = true;

//

票 = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,

NULL, _Magic2, 0, CLR_NONE);

如果(票 == -1)

Print("v128-2 > ", _Symbol, " | ", _Timeframe,

" -> SELL (2) > Error (opening) #", GetLastError());

否则 is_s2 = true;

//

}

否则 { is_s1 = true; is_s2 = 真; }

}

否则 { is_s1 = true; is_s2 = 真; }

//打印("=卖+++",is_b1,is_b2,"==",is_s1,is_s2);

// ==========

if(is_b1 && is_s1 && is_b2 && is_s2)

_TimePrevious=_TimeCurrent;

}

//

如果(_IsTrailingStop)

{

if( !FindOrders(_Magic1) ) TrailingStop(_tp);

}

//

如果(_IsStopLoss_0)

StopLoss_0(_StopLoss_0_From);

//

返回(0);

}



//=++============================================== ================++=

双 DoubleTestZero(双值,双新值)

{

如果(值==0)返回(值);

否则返回(新值);

}



//=++============================================== ================++=

双ND(双值)

{

返回(NormalizeDouble(值,_Digits));

}



//=++============================================== ================++=

// 关闭订单。全部关闭时结束

无效 OrdersDeleteAll(int cmd)

{

而(CountOrders(cmd)> 0)

{

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if((OrderSymbol() == _Symbol)

&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)

&& (OrderType() == cmd) )

{

if(OrderType() == OP_BUY)

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))

Print("v128-2 > ", _Symbol, " > BUY -> ticket=", OrderTicket(),

" -> 错误(关闭)#", GetLastError());

if(OrderType() == OP_SELL)

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))

Print("v128-2 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),

" -> 错误(关闭)#", GetLastError());

}

}

}


}


// 订单数量

}




//=++============================================== ================++=

// 计算方向的订单数量

int CountOrders(int cmd)

{

诠释 n = 0;

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if((OrderSymbol() == _Symbol)

&& (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)

&& (OrderType() == cmd) ) n++;

}

}

返回(n);

}



//=++============================================== ================++=

// 通过魔法搜索订单

bool FindOrders(int magic)

{

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic) )

返回(真);

}

}

返回(假);

}



//=++============================================== ================++=

// 用魔法计算出盈亏平衡水平

无效止损_0(int from)

{

双赢点,出价,询价;

布尔是;

双 P3_buy, P3_sell;

//

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 继续;

//

if(OrderType() == OP_BUY)

{

出价 = MarketInfo(_Symbol, MODE_BID);

利润点 = (出价 - OrderOpenPrice()) / _Point;

是 = 利润点 >= _StopLoss_0_Level + 来自;

P3_buy = ND( OrderOpenPrice() + from * _Point );

//

if( 是 && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )

{

Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,

" -> Bid=", MarketInfo(_Symbol, MODE_BID),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,

" | d=", _StopLoss_0_Level, " | Profitpoint=", 利润点);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))

Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,

" -> BUY > ticket=", OrderTicket(), " > Error (breakeven) #", GetLastError());

}

}

//

否则如果(订单类型()== OP_SELL)

{

询问 = MarketInfo(_Symbol, MODE_ASK);

利润点 = (OrderOpenPrice() - 询价) / _Point;

是 = 利润点 >= _StopLoss_0_Level + 来自;

P3_sell = ND( OrderOpenPrice() - from * _Point );

//

if( 是 && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )

{

Print("v128-2 b4 >", _Symbol, " | ", _Timeframe,

" -> Ask =", MarketInfo(_Symbol, MODE_ASK),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,

" | d=", _StopLoss_0_Level, " | Profitpoint=", 利润点);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))

Print("v128-2 b4 > ", _Symbol, " | ", _Timeframe,

" -> SELL -> ticket=", OrderTicket(), " > Error (breakeven) #", GetLastError());

}

}

}

}

}



//=++============================================== ================++=

// 用魔法计算追踪止损

无效 TrailingStop(int from)

{

双赢点,出价,询价;

双倍价格;

//

for(int i = OrdersTotal() - 1; i >= 0 ; i--)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) 继续;

//

if(OrderType() == OP_BUY)

{

if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;

否则 fromprice = OrderStopLoss();

//

出价 = MarketInfo(_Symbol, MODE_BID);

利润点 = (bid - ND(fromprice)) / _Point;

//

如果(利润点 >= _TrailingStopLevel &&

出价 > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> Bid=", MarketInfo(_Symbol, MODE_BID),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),

" | d=", _TrailingStopLevel, " |profitpoint=", 利润点);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> BUY > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());

}

}

}

//

否则如果(订单类型()== OP_SELL)

{

if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point;

否则 fromprice = OrderStopLoss();

//

询问 = MarketInfo(_Symbol, MODE_ASK);

利润点 = (ND(fromprice) - 询价) / _Point;

//

如果(利润点 >= _TrailingStopLevel &&

询问 < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> Ask=", MarketInfo(_Symbol, MODE_ASK),

" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),

" | d=", _TrailingStopLevel, " |profitpoint=", 利润点);

if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),

OrderTakeProfit(), 0, CLR_NONE))

{

Print("v128-2 v4 >", _Symbol, " | ", _Timeframe,

" -> SELL > ticket=", OrderTicket(), " > Error (trailing stop) #", GetLastError());

}

}

}

}

}

}



//=++============================================== ================++=

// 寻找局部底部。返回价格

双 FindPriceMinMax(bool isUp)

{

整数移位 = 1;

双倍价格 = 0, p0,p1,p2;

而(价格== 0)

{

p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);

p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);

p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);

//Print("v128-2 >", _Symbol, " | ", _Timeframe,

// " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);

如果(是向上)

{

if(p0 !=0 && p0 == p1) // 找到顶点

价格 = p0;

}

别的

{

if(p0 != 0 && p0 == p2) // 找到底部

价格 = p0;

}

班次++;

}

//Print("v128-2 >", _Symbol, " | ", _Timeframe,

// " -> return(price)=", price);

回报(价格);

}



//================================================= =====================

// 从文件中读取变量。

// 如果文件不存在,则创建文件并将变量写入文件

double _FileReadWriteDouble(字符串文件名,双值)

{

int h1 = FileOpen(文件名,FILE_BIN);

如果(h1 > 0)

{

值 = FileReadDouble(h1, DOUBLE_VALUE);

文件关闭(h1);

}

别的

{

h1 = FileOpen(文件名, FILE_BIN|FILE_WRITE);

FileWriteDouble(h1, value, DOUBLE_VALUE);

文件关闭(h1);

}

返回(值);

}



//================================================= =====================

// 将变量写入文件

void _FileWriteDouble(字符串文件名,双值)

{

int h1 = FileOpen(文件名, FILE_BIN|FILE_WRITE);

FileWriteDouble(h1, value, DOUBLE_VALUE);

文件关闭(h1);

}