9 bejegyzés megtekintése - 1-9 / 9
  • Szerző
    Bejegyzés
  • liftfish
    Tag
    Bejegyzések száma: 5

    Sziasztok!
    Van egy robotom, ami elég jó kis stratégia szerint köt, de van egy hibája és nem tudok rájönni, hogy hol kell változtatni a kódon.
    A hiba: a megbízás beadásakor több számjegyet próbál küldeni. Pl: EUR/USD
    1,22796714. Ez egyértelműen sok.
    Ilyenkor ki ír egy hibát az expert fül alatt, ami a következő:
    inavilid price 1,22796714 for order send function
    Így a megbízást sem sikerül betennie. Ellenben az a hiba nem mindig áll fent de nagyrészt igen.

    Előre is köszi!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    A NormalizeDouble(x, Digits); eljárást használd, az x természetesen a nyitási ár legyen. Ez meg fogja oldani az ilyen jellegű hibákat.

    liftfish
    Tag
    Bejegyzések száma: 5

    Szia!
    Köszönöm a gyors választ, de sajnos nem értek hozzá annyira.
    Bemásolnám ide a kódot, ha nem probléma.
    Meg tudnád nekem nézni?
    Előre is köszi!

    //+------------------------------------------------------------------+
    //|                                                       EM_VOL.mq4 |
    //|                                 Copyright © 2011, AutomatiKForeX |
    //|                           http://www.automatikforex.blogspot.com |
    //+------------------------------------------------------------------+
    //----
    extern int     MMType=1;       
    extern bool    UseClose=false; 
    extern bool    UseAdd=true;    
    extern double  LotExponent=1.2; 
    extern double  slip=3;   
    extern double  Lots=0.2; 
    extern double  LotsDigits=2;  
    extern double  TakeProfit=500; 
    extern double  Stoploss=500; 
    extern double  TrailStart=30;
    extern double  TrailStop=50;
    extern double  PipStep=30; 
    extern int     MaxTrades=30;
    extern bool    UseEquityStop=false;
    extern double  TotalEquityRisk=20; 
    extern bool    UseTrailingStop=true;
    extern bool    UseTimeOut=false;
    extern double  MaxTradeOpenHours=48;
    extern double MaximumRisk=0.008;
    //----
    int MagicNumber=675;
    double PriceTarget, StartEquity, BuyTarget, SellTarget;
    double AveragePrice, SellPoint, BuyPoint;
    double LastBuyPrice, LastSellPrice, ClosePrice, Spread;
    int flag;
    string EAName="EM-VOL 1/1vs C";
    datetime timeprev=0, expiration;
    int NumOfTrades=0;
    double iLots;
    int cnt=0, total;
    double Stopper=0;
    bool TradeNow=false, LongTrade=false, ShortTrade=false;
    int ticket;
    bool NewOrdersPlaced=false;
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int init()
      {
       Spread=MarketInfo(Symbol(), MODE_SPREAD)*Point;
       return(0);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int deinit()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
      int start()
      {
         if (UseTrailingStop)
         {
          TrailingAlls(TrailStart, TrailStop, AveragePrice);
         }
         if (UseTimeOut){
            if(CurTime()>=expiration)
            {
             CloseThisSymbolAll();
             Print("Closed All due to TimeOut");
            }
         }
         if(timeprev==Time[0])
         {
          return(0);
         }
       timeprev=Time[0];
    //----
       double CurrentPairProfit=CalculateProfit();
         if(UseEquityStop){
            if(CurrentPairProfit(TotalEquityRisk/100)*AccountEquityHigh())
            {
             CloseThisSymbolAll();
             Print("Closed All due to Stop Out");
             NewOrdersPlaced=false;
            }
         }
       total=CountTrades();
    //----
         if (total==0)
         {
          flag=0;
         }
       double LastBuyLots;
       double LastSellLots;
         for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
          if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)continue;
          if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
               if(OrderType()==OP_BUY)
               {
                LongTrade=true;
                ShortTrade=false;
                LastBuyLots=OrderLots();
                break;
               }
          if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
               if(OrderType()==OP_SELL)
               {
                LongTrade=false;
                ShortTrade=true;
                LastSellLots=OrderLots();
                break;
               }
         }
         
         double PivPnt=(iHigh(Symbol(),0,1)+iLow(Symbol(),0,1)+iClose(Symbol(),0,1)+iOpen(Symbol(),0,1))/4;
         
          double Res1=iHigh(Symbol(),0,1)+iATR(Symbol(),0,14,1);
          double Sup1=iLow(Symbol(),0,1)-iATR(Symbol(),0,14,1);
          double C1=iClose(Symbol(),0,1);
          double O1=iOpen(Symbol(),0,1);
          double L1=iLow(Symbol(),0,1);
          double H1=iHigh(Symbol(),0,1);
          double BandUP=iBands(Symbol(),0,20,2,0,PRICE_CLOSE,MODE_UPPER,0);
          double BandDown=iBands(Symbol(),0,20,2,0,PRICE_CLOSE,MODE_LOWER,0);
          double L2=iLow(Symbol(),0,2);
          double H2=iHigh(Symbol(),0,2);
          double C2=iClose(Symbol(),0,2);
          double ADX=iADX(NULL,0,14,PRICE_CLOSE,MODE_MAIN,1);
         if(total>0 && total=(PipStep*Point))
            {
             TradeNow=true;
            }
            if(ShortTrade && (Bid - LastSellPrice)>=(PipStep*Point))
            {
             TradeNow=true;
            }
         }
         if (total 0)
                  {//#
                   RefreshRates();
                   ticket=OpenPendingOrder(OP_SELL,iLots,Bid,slip,Ask,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Orange);
                   if(ticket0)
                     {//#
                      ticket=OpenPendingOrder(OP_BUY,iLots,Ask,slip,Bid,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Blue);
                      if(ticket<0)
                      {Print("Error: ",GetLastError()); return(0);}
                      LastBuyPrice=FindLastBuyPrice();
                      TradeNow=false;
                      NewOrdersPlaced=true;
                     }//#
                  }
               }
         }
         if (TradeNow && total<1)
         {
          
          SellPoint=Sup1-(1*Point);
          BuyPoint=Res1+(1*Point);
            if(!ShortTrade)
            {
             NumOfTrades=total;
               if(ADX0)
                  {//#
                   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPoint,slip,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Red);
                   if(ticket<0){Print(iLots,"Error: ",GetLastError()); return(0);
                   }
                   LastBuyPrice=FindLastBuyPrice();
                   NewOrdersPlaced=true;
                  }//#
               }
              if(!LongTrade)
              NumOfTrades=total;
               if(ADX0)
                  
                  {//#      
                   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPoint,slip,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);
                   if(ticket0) expiration=CurTime()+MaxTradeOpenHours*60*60;
          TradeNow=false;
         }
    //----------------------- CALCULATE AVERAGE OPENING PRICE
       total=CountTrades();
       AveragePrice=0;
       double Count=0;
       for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
         {
          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
             continue;
          if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               {
                AveragePrice=AveragePrice+OrderOpenPrice()*OrderLots();
                Count=Count + OrderLots();
               }
         }
       if(total > 0)
          AveragePrice=NormalizeDouble(AveragePrice/Count, Digits);
    //----------------------- RECALCULATE STOPLOSS & PROFIT TARGET BASED ON AVERAGE OPENING PRICE
       if(NewOrdersPlaced)
          for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
            {
             OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
             if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                continue;
             if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                if(OrderType()==OP_BUY) // Calculate profit/stop target for long 
                  {
                   PriceTarget=AveragePrice+(TakeProfit*Point);
                   BuyTarget=PriceTarget;
                   Stopper=AveragePrice-(Stoploss*Point);
                   //      Stopper=0; 
                   flag=1;
                  }
             if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                if(OrderType()==OP_SELL) // Calculate profit/stop target for short
                  {
                   PriceTarget=AveragePrice-(TakeProfit*Point);
                   SellTarget=PriceTarget;
                   Stopper=AveragePrice+(Stoploss*Point);
                   //      Stopper=0; 
                   flag=1;
                  }
            }
    //----------------------- IF NEEDED CHANGE ALL OPEN ORDERS TO NEWLY CALCULATED PROFIT TARGET    
       if(NewOrdersPlaced)
          if(flag==1)// check if average has really changed
            {
             for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
               {
                //     PriceTarget=total;
                OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                   continue;
                if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                   //      OrderModify(OrderTicket(),0,Stopper,PriceTarget,0,Yellow);// set all positions to averaged levels
                   OrderModify(OrderTicket(),AveragePrice,OrderStopLoss(),PriceTarget,0,Yellow);// set all positions to averaged levels
                NewOrdersPlaced=false;
               }
            }
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    double ND(double v){return(NormalizeDouble(v,Digits));}
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
      int fOrderCloseMarket(bool aCloseBuy=true,bool aCloseSell=true)
      {
       int tErr=0;
         for(int i=OrdersTotal()-1;i>=0;i--)
         {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
               {
                  if(OrderType()==OP_BUY && aCloseBuy)
                  {
                   RefreshRates();
                     if(!IsTradeContextBusy())
                     {
                        if(!OrderClose(OrderTicket(),OrderLots(),ND(Bid),5,CLR_NONE))
                        {
                         Print("Error close BUY "+OrderTicket());//+" "+fMyErDesc(GetLastError())); 
                         tErr=-1;
                        }
                     }
                     else
                     {
                      static int lt1=0;
                        if(lt1!=iTime(NULL,0,0))
                        {
                         lt1=iTime(NULL,0,0);
                         Print("Need close BUY "+OrderTicket()+". Trade Context Busy");
                        }
                      return(-2);
                     }
                  }
                  if(OrderType()==OP_SELL && aCloseSell)
                  {
                   RefreshRates();
                     if(!IsTradeContextBusy())
                     {
                        if(!OrderClose(OrderTicket(),OrderLots(),ND(Ask),digit,CLR_NONE))
                        {
                         Print("Error close SELL "+OrderTicket());//+" "+fMyErDesc(GetLastError())); 
                         tErr=-1;
                        }
                     }
                     else
                     {
                      static int lt2=0;
                        if(lt2!=iTime(NULL,0,0))
                        {
                         lt2=iTime(NULL,0,0);
                         Print("Need close SELL "+OrderTicket()+". Trade Context Busy");
                        }
                      return(-2);
                     }
                  }
               }
            }
         }
       return(tErr);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
      double fGetLots(int aTradeType)
      {
       double tLots;
         switch(MMType)
         {
             case 0:
                tLots=Lots;
                break;
             case 1:
                tLots=NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),LotsDigits);
                break;
             case 2:
                int LastClosedTime=0;
                tLots=Lots;
                  for(int i=OrdersHistoryTotal()-1;i>=0;i--)
                  {
                     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
                     {
                        if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                        {
                           if(LastClosedTime<OrderCloseTime())
                           {
                            LastClosedTime=OrderCloseTime();
                              if(OrderProfit()<0)
                              {
                               tLots=NormalizeDouble(OrderLots()*LotExponent,LotsDigits);
                              }
                              else
                              {
                               tLots=Lots;
                              }
                           }
                        }
                     }
                     else
                     {
                      return(-3);
                     }
                  }
                break;
            }
            if(AccountFreeMarginCheck(Symbol(),aTradeType,tLots)=0;trade--)
                  {
                   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
                      if(OrderType()==OP_SELL || OrderType()==OP_BUY)
                         count++;
                  }//for
                return(count);
               }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
             void CloseThisSymbolAll()
               {
                int trade;
                for(trade=OrdersTotal()-1;trade>=0;trade--)
                  {
                   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
                   if(OrderSymbol()!=Symbol())
                      continue;
                   if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
                     {
                      if(OrderType()==OP_BUY)
                         OrderClose(OrderTicket(),OrderLots(),Bid,slip,Blue);
                      if(OrderType()==OP_SELL)
                         OrderClose(OrderTicket(),OrderLots(),Ask,slip,Red);
                     }
                   Sleep(1000);
                  }
               }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
             int OpenPendingOrder(int pType,double pLots,double pLevel,int sp, double pr, int sl, int tp,string pComment,int pMagic,datetime pExpiration,color pColor)
               {
                int ticket=0;
                int err=0;
                int c=0;
                int NumberOfTries=100;
                switch(pType)
                  {
                   case OP_BUYLIMIT:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         ticket=OrderSend(Symbol(),OP_BUYLIMIT,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(1000);
                               continue;
                              }
                            else //normal error
                              {
                               break;
                              }
                           }
                        }
                      break;
                   case OP_BUYSTOP:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         ticket=OrderSend(Symbol(),OP_BUYSTOP,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(5000);
                               continue;
                              }
                            else //normal error
                              {
                               break;
                              }
                           }
                        }
                      break;
                   case OP_BUY:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         RefreshRates();
                         ticket=OrderSend(Symbol(),OP_BUY,pLots,Ask,sp,StopLong(Bid,sl),TakeLong(Ask,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(5000);
                               continue;
                              }
                            else //normal error
                              {
                               break;
                              }
                           }
                        }
                      break;
                   case OP_SELLLIMIT:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         ticket=OrderSend(Symbol(),OP_SELLLIMIT,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(5000);
                               continue;
                              }
                            else //normal error
                              {
                               break;
                              }
                           }
                        }
                      break;
                   case OP_SELLSTOP:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         ticket=OrderSend(Symbol(),OP_SELLSTOP,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(5000);
                               continue;
                              }
                            else //normal error
                              {
                               break;
                              }
                           }
                        }
                      break;
                   case OP_SELL:
                      for(c=0;c =0;cnt--)
                  {
                   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                        {
                         Profit=Profit+OrderProfit();
                        }
                  }
                return(Profit);
               }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
             void TrailingAlls(int start,int stop, double AvgPrice)
               {
                int profit;
                double stoptrade;
                double stopcal;
                if(stop==0)
                   return;
                int trade;
                for(trade=OrdersTotal()-1;trade>=0;trade--)
                  {
                   if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
                      continue;
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)
                     {
                      if(OrderType()==OP_BUY)
                        {
                         profit=NormalizeDouble((Bid-AvgPrice)/Point,0);
                         if(profitstoptrade))
                            //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);
                            OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Aqua);
                        }//Long
                      if(OrderType()==OP_SELL)
                        {
                         profit=NormalizeDouble((AvgPrice-Ask)/Point,0);
                         if(profit<start)
                            continue;
                         stoptrade=OrderStopLoss();
                         stopcal=Ask+(stop*Point);
                         if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))
                            //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);
                            OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Red);
                        }//Shrt
                     }
                   Sleep(1000);
                  }//for
               }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
             double AccountEquityHigh()
               {
                static double AccountEquityHighAmt,PrevEquity;
                if(CountTrades()==0) AccountEquityHighAmt=AccountEquity();
                if(AccountEquityHighAmt =0;cnt--)
                  {
                   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_BUY)
                     {
                      ticketnumber=OrderTicket();
                      if(ticketnumber>oldticketnumber)
                        {
                         orderprice=OrderOpenPrice();
                         oldorderopenprice=orderprice;
                         oldticketnumber=ticketnumber;
                        }
                     }
                  }
                return(orderprice);
               }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
             double FindLastSellPrice()
               {
                double oldorderopenprice=0, orderprice;
                int cnt, oldticketnumber=0, ticketnumber;
                for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
                  {
                   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_SELL)
                     {
                      ticketnumber=OrderTicket();
                      if(ticketnumber>oldticketnumber)
                        {
                         orderprice=OrderOpenPrice();
                         oldorderopenprice=orderprice;
                         oldticketnumber=ticketnumber;
                        }
                     }
                  }
                return(orderprice);
               }
    //+----------
    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Minden OrderSend() függvény 4. paraméterét foglald bele az x helyére!

    Tehát ha ez van: SellPoint

    akkor ezt cseréld ki

    NormalizeDouble(SellPoint, Digits)

    -re! És így tovább…

    liftfish
    Tag
    Bejegyzések száma: 5

    Szia Radu!
    Köszi a választ!
    Esetleg egy példát tudnál nekem írni(mutatni), ha nem túl nagy gond?

    liftfish
    Tag
    Bejegyzések száma: 5

    Esetleg privát üzenetet tudok neked küldeni? Mert ha meg tudnád csinálni nekem, akkor megbeszélnénk a részleteket.
    Előre is köszi!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    A névjegy menüpontban megtalálod az e-mail címemet!

    liftfish
    Tag
    Bejegyzések száma: 5

    Szia Radu!
    Felvettem veled a kapcsolatot a privát email- eden, ellenben még nem jött válasz.
    Csak azt szeretném kérdezni, hogy sikerült e megkapni és elolvasni?
    Köszi!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Most tudtam csak reagálni – email ment.

9 bejegyzés megtekintése - 1-9 / 9
  • Be kell jelentkezni a hozzászóláshoz.