我将免费撰写一份顾问报告 - 页 21 1...141516171819202122232425262728...171 新评论 MIR_KAZAN 2015.05.08 15:23 #201 Vitalii Ananev:你的意思是在D1蜡烛的开盘时开启交易吗?如果是这样,请将专家顾问的逻辑设置为只在特定时间打开交易。 我明白了,还有一个问题:我在价格的+15点处挂了两个挂单,还有一个SellStop和一个ByStop。而在每一次打勾 时,我都会把它们移到一个新的价格。在价格剧烈波动期间(最常见的是在新闻事件期间),只要价格触及它们,终端就会挂起。(为什么会结冰? Vitalii Ananev 2015.05.09 08:28 #202 MIR_KAZAN: 我明白了,还有一个问题:我在距离价格+15点的位置挂了两笔订单:买入止损和卖出止损。而在每一次打勾时,我都会把它们移到一个新的价格。在价格剧烈波动期间(最常见的是在新闻事件期间),只要价格触及它们,终端就会挂起。(为什么会结冰?我不能说它为什么会挂断,我不是灵媒,处理专家顾问的代码。我可以假设,在订单被执行后,你的EA试图将其转移到一个新的价格,但由于挂单 已经在市场上,你的EA挂起。尝试在日志中显示专家顾问的关键变量的状态,以分析其操作逻辑。 MIR_KAZAN 2015.05.09 09:46 #203 Vitalii Ananev:我不能说它为什么会挂断,我不是灵媒,处理专家顾问的代码。我可以假设,在订单被执行后,你的EA试图将其转移到一个新的价格,但由于挂单 已经在市场上,你的EA挂起。尝试在日志中显示EA的关键变量的状态,以分析其工作逻辑。我想我已经正确设置了所有条件。 input int Magic = 12; // Магический номер ордеров input int Proskalzivanie = 5; // Проскальзывание input int period = 200; // Количество свечей для анализа волятильности input int tral = 20; // Дистанция траллинга в пунктах input int tral_step = 3; // Шаг срабатывания траллинга input bool use_step = true; // Использовать шаг input double Lot = 0.01; // Лот input double otstups = 0.0006; // Отступ от цены//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+ int OnInit() {//--- return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+ void OnDeinit(const int reason) {//--- return; }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+ void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); for (int pos=OrdersTotal()-1; pos>=0; pos--) { if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderType()<2) { double SLPrice; if (OrderType()==OP_BUY) { if (_Step_Use) { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig)) { SLPrice=NormalizeDouble(Ask-_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } else { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig)) { SLPrice=NormalizeDouble(Bid+_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } } } }} void OnTick() {//--- double lot=Lot_Normalize(Symbol(),Lot,1); double sl= Dist_Normalize(Symbol(),tral); double step=Dist_Normalize(Symbol(),tral_step); double otstup=NormalizeDouble(otstups,Digits); int ord[8]; Uchet_Orderov_Function(Symbol(),Magic,ord); if(ord[7]==2 && ord[6]==0 && Volume[0]==1) { Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie); if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==0 && ord[7]==0 && Volume[0]==1) { if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } }//+------------------------------------------------------------------+// Средняя волятильность свечей//+------------------------------------------------------------------+ double Volatility(int _period){ double summ=0; for (int i=1; i<=_period; i++) { summ+=MathAbs(High[i]-Low[i]); } return(NormalizeDouble(summ/_period,Digits)); }//+------------------------------------------------------------------+// Нормализация лота для любых брокеров//+------------------------------------------------------------------+ double Lot_Normalize(string _Symvol, double _lot, double _mult){ double minlot = MarketInfo(_Symvol,MODE_MINLOT); double maxlot = MarketInfo(_Symvol,MODE_MAXLOT); double steplot = MarketInfo(_Symvol,MODE_LOTSTEP); double lot=_lot*_mult; if (lot<=minlot)lot=minlot; else if(lot>=maxlot) lot=maxlot; else if (lot>minlot && lot<maxlot) { int k=int((lot-minlot)/steplot); lot=NormalizeDouble(minlot+k*steplot,2); } return(lot);} double Dist_Normalize(string _Simvol, int _Distancia){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); double Pip=MarketInfo(_Simvol,MODE_POINT); if(Dig==3 || Dig==5) return NormalizeDouble(_Distancia*5*Pip,Dig); else return NormalizeDouble(_Distancia*Pip,Dig); }//+------------------------------------------------------------------+// Учет ордеров//+------------------------------------------------------------------+ void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){ ArrayInitialize(_Mas,0); int Ticket=-1; for (int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderTicket()!=Ticket) { Ticket=OrderTicket(); switch(OrderType()) { case 0:{_Mas[0]++;_Mas[6]++;break;} case 1:{_Mas[1]++;_Mas[6]++;break;} case 2:{_Mas[2]++;_Mas[7]++;break;} case 3:{_Mas[3]++;_Mas[7]++;break;} case 4:{_Mas[4]++;_Mas[7]++;break;} case 5:{_Mas[5]++;_Mas[7]++;break;} } } }} void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie){ for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic) { if(OrderType()>1) { if (!OrderDelete(OrderTicket(),clrNONE)) Alert("Ошибка при удалении отложенного ордера!" , GetLastError()); } else { if (OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } else { if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } } }}} I will write an 初学者的问题 MQL4 MT4 MetaTrader Questions from Beginners MQL4 Rustam Ayupov 2015.05.10 04:07 #204 khorosh: 你没有考虑到买入限额只能设置在价格以下,卖出限额只能设置在价格以上。对于你所建议的,你需要使用止损单。同意,谢谢你理解我混乱的算法。我仍然对吊坠的名称感到困惑......。 让他们成为停止的人,也许我们应该尝试建立一个EA?我稍后将进行测试,并展示会发生什么?...或者给我一个链接,我又没有发现美国? Vitalii Ananev 2015.05.10 04:50 #205 MIR_KAZAN:我想我已经正确设置了所有的测试条件。input int Magic = 12; // Магический номер ордеров input int Proskalzivanie = 5; // Проскальзывание input int period = 200; // Количество свечей для анализа волятильности input int tral = 20; // Дистанция траллинга в пунктах input int tral_step = 3; // Шаг срабатывания траллинга input bool use_step = true; // Использовать шаг input double Lot = 0.01; // Лот input double otstups = 0.0006; // Отступ от цены//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+ int OnInit() {//--- return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+ void OnDeinit(const int reason) {//--- return; }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+ void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); for (int pos=OrdersTotal()-1; pos>=0; pos--) { if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderType()<2) { double SLPrice; if (OrderType()==OP_BUY) { if (_Step_Use) { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig)) { SLPrice=NormalizeDouble(Ask-_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } else { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig)) { SLPrice=NormalizeDouble(Bid+_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } } } }} void OnTick() {//--- double lot=Lot_Normalize(Symbol(),Lot,1); double sl= Dist_Normalize(Symbol(),tral); double step=Dist_Normalize(Symbol(),tral_step); double otstup=NormalizeDouble(otstups,Digits); int ord[8]; Uchet_Orderov_Function(Symbol(),Magic,ord); if(ord[7]==2 && ord[6]==0 && Volume[0]==1) { Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie); if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==0 && ord[7]==0 && Volume[0]==1) { if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } }//+------------------------------------------------------------------+// Средняя волятильность свечей//+------------------------------------------------------------------+ double Volatility(int _period){ double summ=0; for (int i=1; i<=_period; i++) { summ+=MathAbs(High[i]-Low[i]); } return(NormalizeDouble(summ/_period,Digits)); }//+------------------------------------------------------------------+// Нормализация лота для любых брокеров//+------------------------------------------------------------------+ double Lot_Normalize(string _Symvol, double _lot, double _mult){ double minlot = MarketInfo(_Symvol,MODE_MINLOT); double maxlot = MarketInfo(_Symvol,MODE_MAXLOT); double steplot = MarketInfo(_Symvol,MODE_LOTSTEP); double lot=_lot*_mult; if (lot<=minlot)lot=minlot; else if(lot>=maxlot) lot=maxlot; else if (lot>minlot && lot<maxlot) { int k=int((lot-minlot)/steplot); lot=NormalizeDouble(minlot+k*steplot,2); } return(lot);} double Dist_Normalize(string _Simvol, int _Distancia){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); double Pip=MarketInfo(_Simvol,MODE_POINT); if(Dig==3 || Dig==5) return NormalizeDouble(_Distancia*5*Pip,Dig); else return NormalizeDouble(_Distancia*Pip,Dig); }//+------------------------------------------------------------------+// Учет ордеров//+------------------------------------------------------------------+ void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){ ArrayInitialize(_Mas,0); int Ticket=-1; for (int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderTicket()!=Ticket) { Ticket=OrderTicket(); switch(OrderType()) { case 0:{_Mas[0]++;_Mas[6]++;break;} case 1:{_Mas[1]++;_Mas[6]++;break;} case 2:{_Mas[2]++;_Mas[7]++;break;} case 3:{_Mas[3]++;_Mas[7]++;break;} case 4:{_Mas[4]++;_Mas[7]++;break;} case 5:{_Mas[5]++;_Mas[7]++;break;} } } }} void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie){ for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic) { if(OrderType()>1) { if (!OrderDelete(OrderTicket(),clrNONE)) Alert("Ошибка при удалении отложенного ордера!" , GetLastError()); } else { if (OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } else { if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } } }}}恐怕我不能帮助你,因为你的代码不适合分析。也许你可以添加一些评论来提高你对它的理解。目前还不清楚ord[]数组的用途,以及它存储的数据是什么。我是这样理解你的代码的:每一个tick你都在数组中写入订单类型(Uchet_Orderov_Function(Symbol(),Magic,ord);)。然后检查条件if(ord[7]==2 && ord[6]==0 && Volume[0]==1),如果是真的,挂单将被删除,所有头寸将被关闭。然后我们检查条件,如果(ord[6]==0 && ord[7]==0 && Volume[0]==1),如果它是真的,两个挂单被打开。但是在检查条件之前,如果(ord[6]==0 && ord[7]==0 && Volume[0]==1),ord[]数组的值将不会被更新。而且只有在第二次打勾时才会更新。 所以你需要记录所有影响其逻辑的ord[] 数组的值。还要注意这个代码片段。 if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } 我认为有软件的括号丢失了 { .它应该是这样的。 if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } } Victor Nikolaev 2015.05.10 10:34 #206 Vitalii Ananev:还要注意这段代码。 我认为它缺少括号 { .它应该是这样的。在这种情况下,方括号不影响操作(逻辑)。没有错误 Vitalii Ananev 2015.05.10 11:14 #207 Victor Nikolaev: 在这种情况下,方括号对操作(逻辑)没有影响。没有错误。 也许不是,但它更容易阅读。 khorosh 2015.05.10 20:55 #208 akarustam:同意,谢谢你理解我混乱的算法。我仍然对吊坠的名称感到困惑......。 让他们成为停止的人,也许我们应该尝试建立一个EA?我稍后将进行测试,并展示会发生什么?...或者给我一个链接,我又没有发现美国? 要提出建议,你至少要有一个基本的知识。所有简单的想法早就被检验过了,你真的没有发现美国。但找你通过论坛和kodobase链接不太可能有谁会。你需要它,你就去找它。还是说你认为有的人在脑海中一直有各种专家顾问、脚本和指标的链接? Rustam Ayupov 2015.05.10 21:50 #209 khorosh: 你至少要有基本的知识才能提出一些建议。所有简单的想法都已经尝试了很久,确实你没有发现美国。但是,没有人可能在论坛和kodobase上为你寻找一个链接。你需要它,你就去找它。还是说你认为有的人脑子里一直有各种专家顾问、脚本和指标的链接?......假设。 4iterOk 2015.05.14 11:18 #210 (我有一个想法,我需要帮助))为其编写专家顾问我长期以来一直在使用它进行交易。我在一个货币对上每月获得1000点。我从来没有 用我的外汇进行过交易,我也从来没有用过买对。基本上没有缩水,最多5个点。时间框架H41.MA4/simple/close2.MA5/简单/开放其工作原理应该是这样的没有止盈和止损。只在交叉点上开仓和平仓交易。例如,从底部到顶部交叉,打开一个订单,只有当它被交叉回来时才关闭订单。如果有一个反向信号,关闭买单,打开卖单。一般来说,我希望你能理解)在策略中,重要的甚至不是利润,而是这些该死的交叉点)类似这样的东西)在这个策略上交易了很长时间,利润不错,但由于我认为写这个策略的专家顾问不会有什么困难。如果你同意帮忙,这是我的邮件。4iterRrock@mail.ru以下是我已经交易了近一年的模式。 附加的文件: MAxi2r.tpl 2 kb 1...141516171819202122232425262728...171 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你的意思是在D1蜡烛的开盘时开启交易吗?如果是这样,请将专家顾问的逻辑设置为只在特定时间打开交易。
我明白了,还有一个问题:我在距离价格+15点的位置挂了两笔订单:买入止损和卖出止损。而在每一次打勾时,我都会把它们移到一个新的价格。在价格剧烈波动期间(最常见的是在新闻事件期间),只要价格触及它们,终端就会挂起。(为什么会结冰?
我不能说它为什么会挂断,我不是灵媒,处理专家顾问的代码。我可以假设,在订单被执行后,你的EA试图将其转移到一个新的价格,但由于挂单 已经在市场上,你的EA挂起。尝试在日志中显示专家顾问的关键变量的状态,以分析其操作逻辑。
我不能说它为什么会挂断,我不是灵媒,处理专家顾问的代码。我可以假设,在订单被执行后,你的EA试图将其转移到一个新的价格,但由于挂单 已经在市场上,你的EA挂起。尝试在日志中显示EA的关键变量的状态,以分析其工作逻辑。
我想我已经正确设置了所有条件。
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
你没有考虑到买入限额只能设置在价格以下,卖出限额只能设置在价格以上。对于你所建议的,你需要使用止损单。
同意,谢谢你理解我混乱的算法。我仍然对吊坠的名称感到困惑......。
让他们成为停止的人,也许我们应该尝试建立一个EA?
我稍后将进行测试,并展示会发生什么?
...或者给我一个链接,我又没有发现美国?
我想我已经正确设置了所有的测试条件。
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
恐怕我不能帮助你,因为你的代码不适合分析。也许你可以添加一些评论来提高你对它的理解。目前还不清楚ord[]数组的用途,以及它存储的数据是什么。我是这样理解你的代码的:每一个tick你都在数组中写入订单类型(Uchet_Orderov_Function(Symbol(),Magic,ord);)。然后检查条件if(ord[7]==2 && ord[6]==0 && Volume[0]==1),如果是真的,挂单将被删除,所有头寸将被关闭。然后我们检查条件,如果(ord[6]==0 && ord[7]==0 && Volume[0]==1),如果它是真的,两个挂单被打开。但是在检查条件之前,如果(ord[6]==0 && ord[7]==0 && Volume[0]==1),ord[]数组的值将不会被更新。而且只有在第二次打勾时才会更新。
所以你需要记录所有影响其逻辑的ord[] 数组的值。
还要注意这个代码片段。
我认为有软件的括号丢失了 { .它应该是这样的。
还要注意这段代码。
我认为它缺少括号 { .它应该是这样的。
在这种情况下,方括号不影响操作(逻辑)。没有错误
在这种情况下,方括号对操作(逻辑)没有影响。没有错误。
同意,谢谢你理解我混乱的算法。我仍然对吊坠的名称感到困惑......。
让他们成为停止的人,也许我们应该尝试建立一个EA?
我稍后将进行测试,并展示会发生什么?
...或者给我一个链接,我又没有发现美国?
你至少要有基本的知识才能提出一些建议。所有简单的想法都已经尝试了很久,确实你没有发现美国。但是,没有人可能在论坛和kodobase上为你寻找一个链接。你需要它,你就去找它。还是说你认为有的人脑子里一直有各种专家顾问、脚本和指标的链接?
(我有一个想法,我需要帮助))为其编写专家顾问
我长期以来一直在使用它进行交易。我在一个货币对上每月获得1000点。我从来没有 用我的外汇进行过交易,我也从来没有用过买对。基本上没有缩水,最多5个点。
时间框架H4
1.MA4/simple/close
2.MA5/简单/开放
其工作原理应该是这样的没有止盈和止损。只在交叉点上开仓和平仓交易。例如,从底部到顶部交叉,打开一个订单,只有当它被交叉回来时才关闭订单。如果有一个反向信号,关闭买单,打开卖单。一般来说,我希望你能理解)在策略中,重要的甚至不是利润,而是这些该死的交叉点)类似这样的东西)在这个策略上交易了很长时间,利润不错,但由于我认为写这个策略的专家顾问不会有什么困难。
如果你同意帮忙,这是我的邮件。4iterRrock@mail.ru
以下是我已经交易了近一年的模式。