Ошибки в программе , путаница со знаками 3,4,5 digits

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
fregat555
188
fregat555  

 Уважаемые господа!

Кто сможет подправить программу мт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);
}

//+------------------------------------------------------------------+//+------------------------------------------------------------------+
fregat555
188
fregat555  


Dmitiry Ananiev
9328
Dmitiry Ananiev  

Вместо dig используйте _Digits 

В справке написано, ка пользоваться

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий