Zlecenia w okreslonej odleglosci

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Trader1
Pasjonat
Pasjonat
Posty: 387
Rejestracja: 19 sty 2013, 10:25

Zlecenia w okreslonej odleglosci

Nieprzeczytany post autor: Trader1 »

Witam mam problem z dopisaniem do kodu składni która odpowiadała by za sprawdzanie naszych otwartych zleceń i blokowała otwieranie nowych zleceń w predefinowanej odległości x od najbliższego zlecenia. Pomoże mi ktoś.. Chociaż jakieś naprowadzenie Dzięki.

Awatar użytkownika
Trader1
Pasjonat
Pasjonat
Posty: 387
Rejestracja: 19 sty 2013, 10:25

Re: Zlecenia w okreslonej odleglosci

Nieprzeczytany post autor: Trader1 »

Panowie dlaczego w moim prostym programie nie działa funkcja distance do służąca blokowaniu składania zleceń bliższych o x pkt.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                     ProsteEA.mq4 |
//|                                          Copyright 2012, DevPort |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, DevPort"
#property link      "http://www.metaquotes.net"

extern int        TakeProfit     = 20;
extern int        StopLoss       = 2000;
extern double     Lots           = 0.1;
extern int        CustomPeriod   = 1;        // In Minutes: 1, 5, 15, 30, 60, 240, 1440
extern double     Distance       = 20;
extern int        Ilosc_zlecen   = 1;
     
int multiplier;
int BarCount;

   int ticket;
   int wszystkie_zlecenia;
   bool a;
   double wart_bezwzg;
   double liczba;
   double cena_teraz;

double Op(int s) {
  return(iOpen(NULL, CustomPeriod, s));
}

double Cl(int s) {
  return(iClose(NULL, CustomPeriod, s));
}


double Hi(int s) {
  return(iHigh(NULL, CustomPeriod, s));
}

double Lo(int s) {
  return(iLow(NULL, CustomPeriod, s));
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   if(Digits==3 || Digits==5) {
      multiplier=10;
   } else {
      multiplier=1;
   }
   BarCount = Bars;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start(){
   
//---- 
  wszystkie_zlecenia=OrdersTotal();
   if(wszystkie_zlecenia == 0)
    { 
   Comment("Zlecen : ", OrdersTotal());
   if(BarCount < Bars)
    {   
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
         if(ticket>0){
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
         }else Print("Error opening BUYSTOP order : ",GetLastError());
            
      BarCount = Bars;
   }
   }
  
  
                           
  
  
  for( int p=0; p<wszystkie_zlecenia; p++)
    { 
    if(OrderSelect(p,SELECT_BY_POS))
     {
      liczba = Ask - OrderOpenPrice();
      wart_bezwzg = !MathAbs(liczba);
     if( wart_bezwzg /Point > Distance* multiplier)  
      {
   if(OrdersTotal() < Ilosc_zlecen)
    { 
   Comment("Zlecen : ", OrdersTotal());
   if(BarCount < Bars)
    {   
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
         if(ticket>0){
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
         }else Print("Error opening BUYSTOP order : ",GetLastError());
            
      BarCount = Bars;
   }
   }
      } 
     }                                    
    }
//----
   return(0);
  }
//+------------------------------------------------------------------+


Awatar użytkownika
adamForex
Gaduła
Gaduła
Posty: 117
Rejestracja: 28 gru 2015, 10:24

Re: Zlecenia w okreslonej odleglosci

Nieprzeczytany post autor: adamForex »

Zauważyłem 2 błędy.

Pierwszy, to korzystasz z funkcji OnStart(). W nowej wersji mql ta funkcja jest przeznaczona dla skryptów, które wykonują się tylko raz. Dlatego w Twoim kodzie wartość zmiennej liczba cały czas wynosi 0. Czyli po prostu musisz zmienić metodę On Start() na void OnTick() i usunąć z niej "return(0).

Drugi błąd to "!" przed wywołaniem funkcji MathAbs().

Trzeci błąd jest taki, że to będzie działać tylko przy 2 zleceniach. Jak chcesz mieć np. 3, to już 3. może wejść nawet w miejscu 2. zlecenia. Przykładowo:
Pierwsze zlecenie wchodzi na 1.30
Drugie zlecenie na 1.3021 (do tego miejsca wszystko działa ok)
Trzecie zlecenie też wchodzi na 1.3021, bo przy pierwszym obiegu pętli warunek jest spełniony (odległość OrderOpenPrice pierwszego zlecenia od Ask jest większa niż zadany Distance).

Jak chcesz, żeby działało dla dowolnej liczby zleceń, to musisz sprawdzać tylko ostatnie.
Wklejam kod działający poprawnie dla 2 zleceń:

Kod: Zaznacz cały

    //+------------------------------------------------------------------+
    //|                                                     ProsteEA.mq4 |
    //|                                          Copyright 2012, DevPort |
    //|                                        http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2012, DevPort"
    #property link      "http://www.metaquotes.net"

    extern int        TakeProfit     = 20;
    extern int        StopLoss       = 2000;
    extern double     Lots           = 0.1;
    extern int        CustomPeriod   = 1;        // In Minutes: 1, 5, 15, 30, 60, 240, 1440
    extern double     Distance       = 20;
    extern int        Ilosc_zlecen   = 3;
         
    int multiplier;
    int BarCount;

       int ticket;
       int wszystkie_zlecenia;
       bool a;
       double wart_bezwzg;
       double liczba;
       double cena_teraz;

    double Op(int s) {
      return(iOpen(NULL, CustomPeriod, s));
    }

    double Cl(int s) {
      return(iClose(NULL, CustomPeriod, s));
    }


    double Hi(int s) {
      return(iHigh(NULL, CustomPeriod, s));
    }

    double Lo(int s) {
      return(iLow(NULL, CustomPeriod, s));
    }
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       if(Digits==3 || Digits==5) {
          multiplier=10;
       } else {
          multiplier=1;
       }
       BarCount = Bars;
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
   void OnTick(){
       
    //----
      wszystkie_zlecenia=OrdersTotal();
       if(wszystkie_zlecenia == 0)
        {
       Comment("Zlecen : ", OrdersTotal());
       if(BarCount < Bars)
        {   
             ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
             if(ticket>0){
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
             }else Print("Error opening BUYSTOP order : ",GetLastError());
               
          BarCount = Bars;
       }
       }
     
     
                               
     
     
      for( int p=0; p<wszystkie_zlecenia; p++)
        {
        if(OrderSelect(p,SELECT_BY_POS))
         {
          liczba = Ask - OrderOpenPrice();
          wart_bezwzg = MathAbs(liczba);
         if( wart_bezwzg /Point > Distance* multiplier) 
          {
          
       if(OrdersTotal() < Ilosc_zlecen)
        {
       Comment("Zlecen : ", OrdersTotal());
       if(BarCount < Bars)
        {   
             ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
             if(ticket>0){
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
             }else Print("Error opening BUYSTOP order : ",GetLastError());
               
          BarCount = Bars;
       }
       }
          }
         }                                   
        }
    //----
    
      }
    //+------------------------------------------------------------------+


ODPOWIEDZ