请帮助免费编写EA。5个不同的想法。 - 页 15 1...89101112131415 新评论 [删除] 2013.12.02 06:50 #141 就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。 Vladyslav Goshkov 2013.12.02 06:57 #142 GeneratorID: 就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。 谁会对一辆 "旧自行车 "感兴趣?你 还是没有明白,你想开始探索的东西在论坛里早就没有了,代码库里有免费的实现--看看,玩玩。 你有自己的想法吗?否则就没有什么可讨论的。 Vadim Podoprigora 2017.01.04 22:05 #143 请帮我将最大未结订单数量添加到顾问! //+------------------------------------------------ ------------------+ //| 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); } 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 Please help write EAs Any questions from newcomers 1...89101112131415 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。
就这样了。我明白了。"试图 "帮助。我觉得现在是时候分享一些更多的想法了。
谁会对一辆 "旧自行车 "感兴趣?你 还是没有明白,你想开始探索的东西在论坛里早就没有了,代码库里有免费的实现--看看,玩玩。 你有自己的想法吗?否则就没有什么可讨论的。
请帮我将最大未结订单数量添加到顾问!
//+------------------------------------------------ ------------------+
//| 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);
}