Ошибки в программе , путаница со знаками 3,4,5 digits Новый комментарий fregat555 2019.01.25 06:42 Уважаемые господа! Кто сможет подправить программу мт4, есть ошибки: 1. некорректно работает строка 169 для 4 знаковых котировок GBPDKK, AUDNOK и др.(умножает на dig=5), на 4 не получается 2. В строках 205-272 нужно , чтобы в ордерах где SL перенесен выше/ниже цены открытия ордера, подсчитывать сумму фактической, зафиксированной прибыли в валюте депо (в пипсах получается правильно). 3. стоимость пунктов в строках 232,261 считает неправильно. 4. исправить предупреждения: --return value of 'OrderSelect' should be checked inform.mq4 36 7--possible use of uninitialized variable 'op' inform.mq4 71 13 --possible loss of data due to type conversion inform.mq4 324 13 //+------------------------------------------------------------------+ //| inform.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //#include <a-SimpleTrailing.mqh> extern double risk = 20; double Price[2]; int giSlippage; extern int Magic; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int cnt; //trade, cnt, cnt2, ticket; int total=OrdersTotal(); double OpenLots=0; double dig=MarketInfo(OrderSymbol(),MODE_DIGITS); int iOrders=OrdersTotal(), i; double pr=0,pr1=0,pr2=0,pr3=0,pr4=0,pr5=0,pr6=0,pr5s=0,pr6b=0,pr1s=0,pr2b=0; double sprad=MarketInfo(OrderSymbol(),MODE_SPREAD); // double mypoint=MarketInfo(OrderSymbol(),MODE_POINT); double mybid = MarketInfo(OrderSymbol(),MODE_BID); double myask = MarketInfo(OrderSymbol(),MODE_ASK); int profiti,ubitki; // double loti = MarketInfo(OrderSymbol(),MODE_LOTSIZE); //================================ открыто лотов =========================================================== for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_SELL || OrderType()==OP_BUY) { OpenLots += OrderLots(); } } //================================== доступно лотов для торговли ================================================ double Lots=NormalizeDouble(AccountBalance()/1000,1); double raznica = MathMod(Lots,MarketInfo(Symbol(),MODE_LOTSTEP)); if(raznica>0.1){Lots-=raznica;} double Lots2=NormalizeDouble(Lots*risk/100.0,1); if(raznica>0.1){Lots2-=raznica;} double Lots3=MathAbs(Lots2)-MathAbs(OpenLots); if(Lots3<0 && Lots3>(raznica*(-1))){Lots3=0;} int ks; //ks1,ks2; double op,op2,ou,ok,op1; //==================================== расчет общей прибыли ============================================================= for(i=0;i<HistoryTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderProfit()>0) { op+=OrderProfit(); // fpr+=NormalizeDouble(fpr+(OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig),0); } else { ou+=OrderProfit(); } op+=OrderSwap(); ok+=OrderCommission(); ks++; } } } //------------------------------------------- double totalprofit=NormalizeDouble(op+ou+ok,2); double totalprofitpercent=NormalizeDouble(100/(AccountBalance()-totalprofit)*totalprofit,2); //double factprofit=NormalizeDouble(fpr,2); //==================================== подсчет профитных и убыточных текущих сделок =========================================== // int iOrders=OrdersTotal(), i; for(i=iOrders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { //if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) { Print("Error in history!"); break; } if(OrderType()==OP_BUY || OrderType()==OP_SELL) { //if(OrderSymbol()==Symbol() || OrderType()>OP_SELL) continue; //---- // if(OrderProfit()<0) break; if(OrderProfit()>0) profiti++; if (OrderProfit()<0) ubitki ++; } } } //================================= подсчет суммы положительных сделок ==================================================== for(i=iOrders; i>=0; i--) //for(i=0;i<HistoryTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderProfit()>0) { //op1+=OrderProfit(); op1+=OrderProfit()+OrderCommission()+OrderSwap(); // fpr+=NormalizeDouble(fpr+(OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig),0); // } // else // { // ou1+=OrderProfit(); } // ou1+=OrderSwap(); // op2+=OrderCommission(); // ks1++; } } } //--------------------------------------------------------------------------------------------------------------- double realprofit2=NormalizeDouble(op1,2); //======================================================= подсчет суммы отрицательных сделок ================================ for(i=iOrders; i>=0; i--) //for(i=0;i<HistoryTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderProfit()<0) { // op2+=OrderProfit(); op2+=OrderProfit()+OrderCommission()+OrderSwap(); // fpr+=NormalizeDouble(fpr+(OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig),0); // } // else // { // ou1+=OrderProfit(); } // ou2+=OrderSwap(); // op3+=OrderCommission(); // ks2++; } } } //--------------------------------------------------------------------------------------------------------------- double realprofit3=NormalizeDouble(op2,2); double realprofit4=NormalizeDouble(realprofit2+realprofit3,2); //====================================== подсчет профита фактический зафиксированный стоп-лосс по тралу (sell+buy) (pips) ===================== // int k=OrdersTotal(); string sy; if(sy=="0") sy=Symbol(); for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { // double mypoint=MarketInfo(OrderSymbol(),MODE_POINT); // if (dig==0) // if (StringFind(OrderSymbol(), "JPY")<0) dig=5; else dig=3; // if (StringFind(OrderSymbol(), "SEK")<0) dig=5; else dig=4; if(OrderType()==OP_SELL) { // sell&& GetMarketInfo()){ if((OrderProfit()>0)&&(OrderStopLoss()<OrderOpenPrice())) { if((OrderSymbol()=="NZDJPY") ||(OrderSymbol()=="USDJPY") || (OrderSymbol()=="AUDJPY" )|| (OrderSymbol()=="CADJPY") ||(OrderSymbol()=="GBPJPY") || (OrderSymbol()=="NOKJPY" )|| (OrderSymbol()=="ZARJPY") ||(OrderSymbol()=="SEKJPY") || (OrderSymbol()=="EURJPY" )|| (OrderSymbol()=="CHFJPY") ||(OrderSymbol()=="SGDJPY") || (OrderSymbol()=="TRYJPY" )) dig=3; else dig =5; // if((OrderSymbol()=="AUDSEK") ||(OrderSymbol()=="AUDNOK") || (OrderSymbol()=="GBPDKK" )||(OrderSymbol()=="USDMXN")) dig=4; else dig=5; { pr1+=NormalizeDouble(((OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig)),0); } } // pr1+=pr1; } } // return(pr1); } //------------------------------------------------------ ордера Buy ---------------------------------------------- for(i=iOrders; i>=0; i--) { //aaa if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { //bbb // double mypoint=MarketInfo(OrderSymbol(),MODE_POINT); // if (mypoint==0) // if (StringFind(OrderSymbol(), "JPY")<0) dig=5; else dig=3; // if (StringFind(OrderSymbol(), "SEK")<0) dig=5; else dig=4; if(OrderType()==OP_BUY) { //buy if((OrderProfit()>0)&&(OrderStopLoss()>OrderOpenPrice())) { //ccc if((OrderSymbol()=="NZDJPY") ||(OrderSymbol()=="USDJPY") || (OrderSymbol()=="AUDJPY" )|| (OrderSymbol()=="CADJPY") ||(OrderSymbol()=="GBPJPY") || (OrderSymbol()=="NOKJPY" )|| (OrderSymbol()=="ZARJPY") ||(OrderSymbol()=="SEKJPY") || (OrderSymbol()=="EURJPY" )|| (OrderSymbol()=="CHFJPY") ||(OrderSymbol()=="SGDJPY") || (OrderSymbol()=="TRYJPY" )) dig=3; else dig=5; // if((OrderSymbol()=="AUDSEK") ||(OrderSymbol()=="AUDNOK") || (OrderSymbol()=="GBPDKK" )||(OrderSymbol()=="USDMXN")) dig=4; else dig=5; { pr2+=NormalizeDouble(((OrderStopLoss()- OrderOpenPrice())*MathPow(10,dig)),0); } } //ccc } } // return(pr2); } //====================================== подсчет профита фактический зафиксированный стоп-лосс по тралу (sell+buy) (usd) ===================== //============================================================= стоимость пунктов ================================ double loti = MarketInfo(OrderSymbol(),MODE_LOTSIZE); // double StoimPunkt;//(string B) double S = NormalizeDouble(MarketInfo(Symbol(),MODE_TICKVALUE)*(MarketInfo(Symbol(),MODE_POINT) /MarketInfo(Symbol(),MODE_TICKSIZE)),2); //return(S);} double pips_b, pips_s; // {Comment(StoimPunkt(Symbol()));} for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderType()==OP_SELL) { // sell&& GetMarketInfo()){ if((OrderProfit()>0)&&(OrderStopLoss()<OrderOpenPrice())) { // pr5+=OrderProfit()+OrderCommission()+OrderSwap(); // pr5+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); if((OrderSymbol()=="NZDJPY") ||(OrderSymbol()=="USDJPY") || (OrderSymbol()=="AUDJPY" )|| (OrderSymbol()=="CADJPY") ||(OrderSymbol()=="GBPJPY") || (OrderSymbol()=="NOKJPY" )|| (OrderSymbol()=="ZARJPY") ||(OrderSymbol()=="SEKJPY") || (OrderSymbol()=="EURJPY" )|| (OrderSymbol()=="CHFJPY") ||(OrderSymbol()=="SGDJPY") || (OrderSymbol()=="TRYJPY" )) dig=3; else dig=5; { pr5s+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); //usd double s1=pr5s; pr1s+=NormalizeDouble(((OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig)),0); //pips double s2=pr1s; pips_s=NormalizeDouble((s1/s2),2); // pips_s=NormalizeDouble((pr5s/pr1s),2); pr5= NormalizeDouble((pr1s*pips_s),2); // pr5+=(OrderCommission()+OrderSwap()+NormalizeDouble(((OrderOpenPrice()-OrderStopLoss())*MathPow(10,dig)),0)*pips_s); // pr5+=OrderProfit()+OrderCommission()+OrderSwap(); // pr5+=OrderProfit(); // pr5=NormalizeDouble(pr5+(OrderProfit()),2); } } // ab+=OrderSwap();// bc+=OrderCommission(); // cd++; // pr1+=pr1; } } } //------------------------------------------------------ ордера Buy ---------------------------------------------- for(i=iOrders; i>=0; i--) { //aaa if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { //bbb if(OrderType()==OP_BUY) { //buy if((OrderProfit()>0)&&(OrderStopLoss()>OrderOpenPrice())) { //ccc // pr6+=OrderProfit()+OrderCommission()+OrderSwap(); // pr6+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); if((OrderSymbol()=="NZDJPY") ||(OrderSymbol()=="USDJPY") || (OrderSymbol()=="AUDJPY" )|| (OrderSymbol()=="CADJPY") ||(OrderSymbol()=="GBPJPY") || (OrderSymbol()=="NOKJPY" )|| (OrderSymbol()=="ZARJPY") ||(OrderSymbol()=="SEKJPY") || (OrderSymbol()=="EURJPY" )|| (OrderSymbol()=="CHFJPY") ||(OrderSymbol()=="SGDJPY") || (OrderSymbol()=="TRYJPY" )) dig=3; else dig=5; { pr6b+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); //usd pr2b+=NormalizeDouble(((OrderStopLoss()- OrderOpenPrice())*MathPow(10,dig)),0); //pips pips_b=NormalizeDouble((pr6b/pr2b),2); pr6= NormalizeDouble((pr2b*pips_b),2); //pr6+=(OrderCommission()+OrderSwap()+NormalizeDouble(((OrderStopLoss()-OrderOpenPrice())*MathPow(10,dig)),0)*pips_s); } // pr6+=OrderProfit()+OrderCommission()+OrderSwap(); // pr6+=OrderProfit(); // pr6=NormalizeDouble(pr6+(OrderProfit()),2); } //ccc // ab1+=OrderSwap(); // bc1+=OrderCommission(); // cd1++; } } } //----------------------------------------------------------------------------- double realprofit5=NormalizeDouble(pr5+pr6,2); //====================== подсчет профита фактический зафиксированный стоп-лосс по тралу (sell+buy) (USD) ======================= /* if((OrderProfit()<0)&& (OrderOpenPrice()< mybid)) //&& (OrderOpenPrice()>OrderStopLoss())) { pr5=NormalizeDouble((pr5+(mybid-OrderOpenPrice())*MathPow(10,dig)),0); // pr1+=pr1; // pr3=NormalizeDouble(OrderProfit(),0); //;(OrderOpenPrice()-OrderStopLoss())*mypoint),0); } // } //------------------------------------------------------------- if((OrderProfit()<0)&& (OrderOpenPrice()>myask)) { //ddd pr6=NormalizeDouble((pr6+(OrderOpenPrice()-myask)*MathPow(10,dig)),0); // pr1+=pr1; // pr3=NormalizeDouble(OrderProfit(),0); //;(OrderOpenPrice()-OrderStopLoss())*mypoint),0); } //ddd */ //-------------------------------------------------------- double realprofit=NormalizeDouble(pr1+pr2,0); // double realprofit2=NormalizeDouble(pr3+pr4,0); double realpoteri=NormalizeDouble(pr5+pr6,0); double realpoteri2=NormalizeDouble(pr6,0); //============================================================================================================================================= Comment("Доступно: ",Lots," Разрешено: ",Lots2," Используется: ",OpenLots," Можно добавить: ",Lots3," Риск: ",risk,"%","\n", "Общая прибыль: ",totalprofit," (",totalprofitpercent,"%)","\n", "Прибыль текущая: ",AccountProfit()," (",NormalizeDouble(100/AccountBalance()*AccountProfit(),2),"%)","\n", "Прибыльные сделки : ",profiti , "\n", "Убыточные сделки : ",ubitki , "\n", "Фактическая прибыль pips : ",realprofit,"\n", "Фактическая прибыль usd : ",realprofit5,"\n", "Сумма прибыльных сделок,usd : ",realprofit2,"\n", "Сумма убыточных сделок, usd : ",realprofit3,"\n", "Прибыль текущая, usd : ",realprofit4,"\n", "Cтоимость пункта бай usd : ",pips_b, "\n", "Cтоимость пункта sell usd : ",pips_s, "\n", "Текущий убыток pips : ", realpoteri,"\n", "Текущий убыток usd : ", realpoteri2); //========================================================================= tral simple ========================================== return(0); } //+------------------------------------------------------------------+ //| Function..: GetMarketInfo | //| Returns...: bool Success. | //+------------------------------------------------------------------+ bool GetMarketInfo() { RefreshRates(); Price[0]=MarketInfo(OrderSymbol(),MODE_ASK); Price[1]=MarketInfo(OrderSymbol(),MODE_BID); double dPoint=MarketInfo(OrderSymbol(),MODE_POINT); if(dPoint==0) return(false); giSlippage=(Price[0]-Price[1])/dPoint; return(Price[0]>0.0 && Price[1]>0.0); } //+------------------------------------------------------------------+//+------------------------------------------------------------------+ Автоматический трейдер MACD MetaTrader 4 Mobile, build 184 Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению! fregat555 2019.01.28 05:45 #1 Dmitiry Ananiev 2019.01.29 16:36 #2 Вместо dig используйте _Digits В справке написано, ка пользоваться Новый комментарий
Уважаемые господа!
Кто сможет подправить программу мт4, есть ошибки:
1. некорректно работает строка 169 для 4 знаковых котировок GBPDKK, AUDNOK и др.(умножает на dig=5), на 4 не получается
2. В строках 205-272 нужно , чтобы в ордерах где SL перенесен выше/ниже цены открытия ордера, подсчитывать сумму
фактической, зафиксированной прибыли в валюте депо (в пипсах получается правильно).
3. стоимость пунктов в строках 232,261 считает неправильно.
4. исправить предупреждения:
--return value of 'OrderSelect' should be checked inform.mq4 36 7
--possible use of uninitialized variable 'op' inform.mq4 71 13
--possible loss of data due to type conversion inform.mq4 324 13