Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1539

 
//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
input double TakeProfit    =2190;
input double Lots          =0.5;
input double TrailingStop  =650;
input int OpenLevel =70;
input int CloseLevel=23;
input int    Period =86;
input int    Period1 =87;
int LastBars=0;
extern int Magic1 = 110721;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   
 
   int    cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
//--- Trade only if new bar has arrived
   if(LastBars!=Bars) LastBars=Bars;
   else return(0);
   if(Bars<100)
     {
      Print("bars less than 100");
      return;
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return;
     }
//--- to simplify the coding and speed up access data are put into internal variables
   if(CountOrders("", -1,Magic1)<1)
     
   total=OrdersTotal();
   if(total<1)
     {
      //--- no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }
      //--- check for long position (BUY) possibility
     if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period)>iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period1)) 
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-TakeProfit*Point,Bid+TakeProfit*Point,"GBPCADD",Magic1,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice());
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }
      //--- check for short position (SELL) possibility
      if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period1)<iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period)) 
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+TakeProfit*Point,Ask-TakeProfit*Point,"GBPCADD",Magic1,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("SELL order opened : ",OrderOpenPrice());
           }
         else
            Print("Error opening SELL order : ",GetLastError());
        }
      //--- exit from the "no opened orders" block
      return;
     }
//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic1)  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
              if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period1)<iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period)) 
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
         else // go to short position
           {
            //--- should it be closed?
           if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period)>iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period1)) 
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
        }
     }
//---
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Подсчет ордеров                                                            |
//+----------------------------------------------------------------------------+
//| -1 - Все типы ордеров                                                      |
//|  0 - ордера типа BUY                                                       |
//|  1 - ордера типа SELL                                                      |
//|  2 - ордера типа BUYLIMIT                                                  |
//|  3 - ордера типа SELLLIMIT                                                 |
//|  4 - ордера типа BUYSTOP                                                   |
//|  5 - ордера типа SELLSTOP                                                  |
//+----------------------------------------------------------------------------+
int CountOrders(string symb="", int or_ty=-1, int magiс=-1) 
  {
   int cnt=0;
   if(symb=="0") symb=_Symbol;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if((OrderSymbol()==symb || symb=="")&&(or_ty<0 || or_ty==OrderType()))
           {
            if(magiс<0 || OrderMagicNumber()==magiс) cnt++;
           }
        }
     }
   return(cnt);
  }

È la cosa giusta da fare?

 
darirunu1:

È la cosa giusta da fare?

//--- to simplify the coding and speed up access data are put into internal variables
   if(CountOrders("", -1,Magic1)<1)
     
   total=OrdersTotal();
   if(total<1)
 
MakarFX:

Grazie, è complicato, l'ho reso più semplice, solo un paio di righe.

 
darirunu1:

Grazie, è complicato, l'ho reso più semplice, solo un paio di righe.

Interessante da vedere, se non è troppo disturbo.
 
MakarFX:
interessante vedere se

for(i=k; i>=0; i--) {

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {

se(OrderSymbol()==Symbol()) {

if(OrderMagicNumber()== Magic) {

{ if(OrderType()>1) continua;

if(OrderType()==OP_BUY || OrderType()==OP_SELL) total++;

}}}}

//---

// total=OrdersTotal();

se(totale<1)

{

 

Ciao a tutti, volevo creare la mia libreria di funzioni perché uso spesso le stesse funzioni nei miei robot. Ho fatto tutto bene. Ho creato la libreria, l'ho messa nella cartella Libraries e l'ho inserita nel mio indicatore usando #import

#importare "andylib.ex4

bool KeyPr (long l, stringa k);

stringa TestFunc ();

#importare

Funzioni specificate nella libreria con una descrizione. Ma le funzioni della libreria non vengono chiamate. Ho provato a mettere il dialogo nella cartella degli indicatori o anche direttamente nel luogo dove si trova l'indicatore che si associa al dialogo, nessun risultato. Quale può essere il problema?

 
Евгений Гуцу:

Ciao a tutti, volevo creare la mia libreria di funzioni perché uso spesso le stesse funzioni nei miei robot. Ho fatto tutto bene. Ho creato la libreria, l'ho messa nella cartella Libraries e l'ho inserita nel mio indicatore usando #import

#importare "andylib.ex4

bool KeyPr (long l, stringa k);

stringa TestFunc ();

#importare

Funzioni specificate nella libreria con una descrizione. Ma le funzioni della libreria non vengono chiamate. Ho provato a mettere il dialogo nella cartella degli indicatori o anche direttamente nella stessa cartella con l'indicatore, che si collega al dialogo, senza risultato. Quale può essere il problema?

includere

Документация по MQL5: Основы языка / Препроцессор / Включение файлов (#include)
Документация по MQL5: Основы языка / Препроцессор / Включение файлов (#include)
  • www.mql5.com
Включение файлов (#include) - Препроцессор - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
darirunu1:

for(i=k; i>=0; i--) {

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {

se(OrderSymbol()==Symbol()) {

if(OrderMagicNumber()== Magic) {

{ if(OrderType()>1) continua;

if(OrderType()==OP_BUY || OrderType()==OP_SELL) total++;

}}}}

//---

// total=OrdersTotal();

se(totale<1)

{

Quello che hai scritto non può funzionare.

Prima si calcola "total++" e poi si azzera e si imposta "OrdersTotal()", cioè tutti gli ordini

 
Евгений Гуцу:

Ciao a tutti, volevo creare la mia libreria di funzioni perché uso spesso le stesse funzioni nei miei robot. Ho fatto tutto bene. Ho creato la libreria, l'ho messa nella cartella Libraries e l'ho inserita nel mio indicatore usando #import

#importare "andylib.ex4

bool KeyPr (long l, stringa k);

stringa TestFunc ();

#importare

Funzioni specificate nella libreria con una descrizione. Ma le funzioni della libreria non vengono chiamate. Ho provato a mettere il dialogo nella cartella degli indicatori o anche direttamente nella stessa cartella con l'indicatore, che si collega al dialogo, senza risultato. Quale può essere il problema?

Ti sei ricordato di scrivere export dopo il nome della funzione nella libreria?

Meglio ancora, non fare una libreria, ma un file .mqh con funzioni, anche senza una classe, e la compilazione prenderà solo le funzioni che sono necessarie e sono chiamate dall'EA/indicatore.
 
Come calcolare una commissione per gli ordini aperti in mt5 per ogni coppia separatamente?
Motivazione: