新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1654 1...164716481649165016511652165316541655165616571658165916601661...1953 新评论 Volodymyr Zubov 2021.10.08 17:29 #16531 MakarFX #:如果你知道有其他选择,请写...你可以帮助别人)。 你在inite中分别制作所有的变量,并通过进一步处理将它们分开(不需要偷懒)。 接下来,对这些块进行括号,并比较返回的变量。 Tretyakov Rostyslav 2021.10.08 17:37 #16532 Volodymyr Zubov #:在init中单独制作所有的变量,并通过进一步处理将它们分开 (不需要偷懒)。接下来,对这些块进行括号,并比较返回的变量。 显示如何。 Volodymyr Zubov 2021.10.08 17:50 #16533 像这样的地方... 我想把整个猫头鹰贴出来,但论坛不允许。 你想要哪个片段? Tretyakov Rostyslav 2021.10.08 17:53 #16534 Volodymyr Zubov #:像这样的地方...你想要哪一块? 查洛... Volodymyr Zubov 2021.10.08 18:01 #16535 我知道) Igor Makanu 2021.10.08 18:25 #16536 关于交易、自动交易系统和策略测试的论坛 MQL4和MQL5的新手有任何问题,帮助和讨论算法和代码 MakarFX, 2021.10.08 18:43 //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CheckForOpen()==0) { if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK"); } if(CheckForOpen()==1) { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK"); } } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=-1, buy=0, sell=0; // Считывание параметров индикаторов 3 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 2 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 1 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 0 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} if(buy ==4) res=0; if(sell==4) res=1; return(res); } 我认为你必须把相同的指标调用包在一个函数中,代码会更紧凑,谁知道,现在你用的是4条的指标值,明天是5条......。 即 int SignalByPuria(const int bar) { malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,bar); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,bar); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,bar); ...... } 有时有些指标在某一栏没有交易信号,我通常使用枚举E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}。 然后 "信号 "函数的签名将是E_CMD SignalByPuria(const int bar) ,EA代码本身将变成这样。 E_CMD Signal_ind_1(const int bar) { .... } E_CMD Signal_ind_2(const int bar) { .... } E_CMD Signal_ind_2(const int bar) { .... } void OnTick() { ..... if(Signal_ind_1 = =CMD_BUY && Signal_ind_2 == CMD_BUY && Signal_ind_3 == CMD_BUY) // открываем ордер на покупку else if(Signal_ind_1 = =CMD_SELL && Signal_ind_2 == CMD_SELL && Signal_ind_3 == CMD_SELL) // открываем ордер на продажу .... } 我认为,这种方法可以让你在已经写好的EA代码中快速添加新的交易信号。 Tretyakov Rostyslav 2021.10.08 18:41 #16537 Igor Makanu #: 我认为你应该把同样的指标调用包装成一个函数,代码会更紧凑,谁知道,现在你在4条上使用指标值,明天在5条上使用......即有时有些指标在某一栏没有交易信号,我通常使用枚举E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}。然后 "信号 "函数的签名将是E_CMD SignalByPuria(const int bar) ,EA代码本身将变成这样。我认为,这种方法可以让你在已经写好的EA代码中快速添加新的交易信号。 谢谢你,伊戈尔,我会考虑的) Volodymyr Zubov 2021.10.08 19:48 #16538 回到我们的话题,以下是MT4的 市场开仓 功能 //+------------------------------------------------------------------+ //| Zero_Level.mq4 | //| Copyright © 2007, Xupypr | //+------------------------------------------------------------------+ // Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов. double Zero_Level(string sy, int mn) { double ZeroLevel=0; double BuyLots=0; double SellLots=0; double BuyProfit=0; double SellProfit=0; double SellLevel; double BuyLevel; int Total=OrdersTotal(); for(int i=Total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()!=sy) continue; if(OrderMagicNumber() != mn) continue; if(OrderType()==OP_BUY) { BuyLots=BuyLots+OrderLots(); BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap(); } if(OrderType()==OP_SELL) { SellLots=SellLots+OrderLots(); SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap(); } } } double TickValue=MarketInfo(sy,MODE_TICKVALUE); if(BuyLots>0) BuyLevel=NormalizeDouble(MarketInfo(sy,MODE_BID)-(BuyProfit/(TickValue*BuyLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS)); else BuyLevel=0; if(SellLots>0) SellLevel=NormalizeDouble(MarketInfo(sy,MODE_ASK)+(SellProfit/(TickValue*SellLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS)); else SellLevel=0; if(BuyLevel>0) ZeroLevel=BuyLevel; if(SellLevel>0) ZeroLevel=SellLevel; return NormalizeDouble(ZeroLevel,_Digits);//Нормализовали полученную цену } //--- End --- //+---------------------------------------------------------------------------+ //| Функция открытия рыночной позиции (c) Boshetunmay 2021 | //+---------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента | //| op - операция | //| ll - лот | //| slipp - проскальзывание | //| sl - уровень стоп | //| tp - уровень тейк | //| comment - коментарий | //| mn - MagicNumber | //| cl - цвет значка открытия | //+---------------------------------------------------------------------------+ // OpenPosition(string symbol,int operation,double volume,int slippage,int stoploss,int takeprofit,string comment,int magic,color); int OpenPosition(string sy, int op, double ll, int slipp, int sl, int tp, string comment, int mn,color cl) { if(op == OP_BUY) // открытие BUY { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_BUY,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Buy, not enough money."); return(0); } RefreshRates(); // открываем ордер OP_BUY int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),slipp,0,0,comment,mn,0,cl); if(ticketbuy<0) Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError()); else Print(sy," OpenPosition. OrderSend Buy successfully"); Sleep(1000); // модифицируем ордер (выставляем тейпрофит и стоплосс) if(sl !=0 || tp !=0) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- вычисленные значения цен SL и TP должны быть нормализованы double BSLoss = NormalizeDouble(Zero_Level(_Symbol,mn)-(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double BTProfit = NormalizeDouble(Zero_Level(_Symbol,mn)+(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if(sl == 0) BSLoss = 0; if(tp == 0) BTProfit = 0; bool resbuy = OrderModify(ticketbuy,OrderOpenPrice(),BSLoss,BTProfit,0,clrNONE); if(!resbuy) Print(sy," OpenPosition. OrderModify Buy fail #",GetLastError()); else Print(sy," OpenPosition. OrderModify Buy successfully"); } } if(op == OP_SELL) // открытие Sell { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_SELL,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Sell, not enough money."); return(0); } RefreshRates(); // открываем ордер OP_SELL int ticketsell = OrderSend(sy,OP_SELL,ll,MarketInfo(sy,MODE_BID),slipp,0,0,comment,mn,0,cl); if(ticketsell<0) Print(sy," OpenPosition. OrderSend Sell fail #",GetLastError()); else Print(sy," OpenPosition. OrderSend Sell successfully"); Sleep(1000); // модифицируем ордер (выставляем тейпрофит и стоплосс) if(sl !=0 || tp !=0) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- вычисленные значения цен SL и TP должны быть нормализованы double SSLoss = NormalizeDouble(Zero_Level(_Symbol,mn)+(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double STProfit = NormalizeDouble(Zero_Level(_Symbol,mn)-(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if(sl == 0) SSLoss = 0; if(tp == 0) STProfit = 0; bool ressell = OrderModify(ticketsell,OrderOpenPrice(),SSLoss,STProfit,0,clrNONE); if(!ressell) Print(sy," OpenPosition. OrderModify Sell fail #",GetLastError()); else Print(sy," OpenPosition. OrderModify Sell successfully"); } } return (1); } //--- End --- 今天归还贸易旗帜 //+----------------------------------------------------------------------------+ //| Описание : Возвращает флаг торгов сегодня. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int isTradeToDay(string sy="", int op=-1, int mn=-1) { int i, k=OrdersHistoryTotal(); if(sy=="0") sy=_Symbol; for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return(1); } } } } } } k=OrdersTotal(); for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) { if(TimeDay(OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear(OrderOpenTime())==Year()) return(1); } } } } } } return(0); } //--- End --- 返回职位数 //+----------------------------------------------------------------------------+ //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if(sy=="0") sy=_Symbol; for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) kp++; } } } } } return(kp); } //--- End --- 所有这些都是针对当前终端的构建而优化的。 Tretyakov Rostyslav 2021.10.08 20:22 #16539 Volodymyr Zubov 职位数 所有这些都是针对当前终端的构建而优化的。 我不明白这些手指是做什么用的? Volodymyr Zubov 2021.10.08 20:30 #16540 MakarFX #: 我不明白为什么会有手指? 有人指责说,只放置OrderSend,然后不抱怨出了问题,这是不合适的。你总是要寻找错误。 1...164716481649165016511652165316541655165616571658165916601661...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如果你知道有其他选择,请写...
你可以帮助别人)。
你在inite中分别制作所有的变量,并通过进一步处理将它们分开(不需要偷懒)。
接下来,对这些块进行括号,并比较返回的变量。
在init中单独制作所有的变量,并通过进一步处理将它们分开 (不需要偷懒)。
接下来,对这些块进行括号,并比较返回的变量。
像这样的地方...
我想把整个猫头鹰贴出来,但论坛不允许。
你想要哪个片段?
像这样的地方...
你想要哪一块?
关于交易、自动交易系统和策略测试的论坛
MQL4和MQL5的新手有任何问题,帮助和讨论算法和代码
MakarFX, 2021.10.08 18:43
我认为你必须把相同的指标调用包在一个函数中,代码会更紧凑,谁知道,现在你用的是4条的指标值,明天是5条......。
即
有时有些指标在某一栏没有交易信号,我通常使用枚举E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}。
然后 "信号 "函数的签名将是E_CMD SignalByPuria(const int bar) ,EA代码本身将变成这样。
我认为,这种方法可以让你在已经写好的EA代码中快速添加新的交易信号。
我认为你应该把同样的指标调用包装成一个函数,代码会更紧凑,谁知道,现在你在4条上使用指标值,明天在5条上使用......
即
有时有些指标在某一栏没有交易信号,我通常使用枚举E_CMD{CMD_BUY,CMD_SELL,CMD_NONE}。
然后 "信号 "函数的签名将是E_CMD SignalByPuria(const int bar) ,EA代码本身将变成这样。
我认为,这种方法可以让你在已经写好的EA代码中快速添加新的交易信号。
回到我们的话题,以下是MT4的 市场开仓 功能
今天归还贸易旗帜
返回职位数
所有这些都是针对当前终端的构建而优化的。
所有这些都是针对当前终端的构建而优化的。
我不明白为什么会有手指?
有人指责说,只放置OrderSend,然后不抱怨出了问题,这是不合适的。你总是要寻找错误。