Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 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);
  }

¿Es esto lo correcto?

 
darirunu1:

¿Es esto lo correcto?

//--- 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:

Gracias. Es complicado. Lo he simplificado, sólo un par de líneas.

 
darirunu1:

Gracias. Es complicado. Lo hice más simple, sólo un par de líneas.

Interesante de ver, si no es mucho problema.
 
MakarFX:
es interesante ver si

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

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

if(OrderSymbol()==Symbol()) {

if(OrderMagicNumber()== Magic) {

{ si(OrderType()>1) continuar;

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

}}}}

//---

// total=Total de pedidos();

if(total<1)

{

 

Hola a todos, quería crear mi propia biblioteca de funciones porque a menudo uso las mismas funciones en mis robots. Lo he hecho todo bien. He creado la biblioteca, la he puesto en la carpeta Libraries y la he introducido en mi indicador usando #import

#importar "andylib.ex4".

bool KeyPr (long l, string k);

string TestFunc ();

#importar

Funciones especificadas en la biblioteca con una descripción. Pero las funciones de la biblioteca no se llaman. He intentado poner el diálogo en la carpeta de indicadores o incluso directamente en la misma carpeta con el indicador, que se conecta al diálogo, sin resultado. ¿Cuál puede ser el problema?

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

Hola a todos, quería crear mi propia biblioteca de funciones porque a menudo uso las mismas funciones en mis robots. Lo he hecho todo bien. He creado la biblioteca, la he puesto en la carpeta Libraries y la he introducido en mi indicador usando #import

#importar "andylib.ex4".

bool KeyPr (long l, string k);

string TestFunc ();

#importar

Funciones especificadas en la biblioteca con una descripción. Pero las funciones de la biblioteca no se llaman. He intentado poner el diálogo en la carpeta de indicadores o incluso directamente en la misma carpeta con el indicador, que se conecta al diálogo, sin resultado. ¿Cuál puede ser el problema?

incluye

Документация по 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)) {

if(OrderSymbol()==Symbol()) {

if(OrderMagicNumber()== Magic) {

{ si(OrderType()>1) continuar;

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

}}}}

//---

// total=Total de pedidos();

if(total<1)

{

Lo que has escrito no puede funcionar.

Primero se calcula "total++" y luego se pone a cero y se fija "OrdersTotal()", es decir, todos los pedidos

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

Hola a todos, quería crear mi propia biblioteca de funciones porque a menudo uso las mismas funciones en mis robots. Lo he hecho todo bien. He creado la biblioteca, la he puesto en la carpeta Libraries y la he introducido en mi indicador usando #import

#importar "andylib.ex4".

bool KeyPr (long l, string k);

string TestFunc ();

#importar

Funciones especificadas en la biblioteca con una descripción. Pero las funciones de la biblioteca no se llaman. He intentado poner el diálogo en la carpeta de indicadores o incluso directamente en el lugar donde se encuentra el indicador que se asocia con el diálogo, sin resultado. ¿Cuál puede ser el problema?

¿Te has acordado de escribir export después del nombre de la función en la biblioteca?

Mejor aún, no hagas una librería, sino un archivo .mqh con funciones, incluso sin una clase, y la compilación tomará sólo aquellas funciones que sean necesarias y sean llamadas desde el EA/indicador.
 
¿Cómo calcular la comisión de las órdenes abiertas en mt5 para cada par por separado?