Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 758

 
Ozero:

Pasa el ";" por detrás del corchete.

El programa funciona, PERO ocasionalmente falla con el error 4108.


Ozero.

Abrir la ayuda, ver los errores de ejecución, y vemos:

4108

ERR_INVALID_TICKET

Número de billete incorrecto.

Piensa y busca...

 

Ayudar a la gente a operar en cada moneda con sus propias órdenes para distinguir y diferenciar + después de la orden abierta si el precio retrocede aún más podría abrir otra orden igual a la primera.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt=0, ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // проверяем TakeProfit
     }
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
 
   total=OrdersTotal();
   if(total<1) 
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // проверяем на возможность встать в длинную позицию (BUY)
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
                          "macd sample",16384,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(0); 
        }
      // проверяем на возможность встать в короткую позицию (SELL)
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
                          "macd sample",16384,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()); 
         return(0); 
        }
      return(0);
     }
   // переходим к важной части эксперта - контролю открытых позиций
   // 'важно правильно войти в рынок, но выйти - еще важнее...'
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
                 return(0); // выходим
                }
            // проверим - может можно/нужно уже трейлинг стоп ставить?
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
                                 OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }
            // проверим - может можно/нужно уже трейлинг стоп ставить?
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
                                 OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// конец.
 

Hola a todos.

Acabo de darme cuenta de que NormalizeDouble funciona de forma extraña.

Es decir, el Asesor Experto funciona bien y no tiene errores, pero los registros en el Probador de Estrategias son muy extraños.

Te lo explicaré.

Calculo el beneficio utilizando esta función. Hago lo que creo que debería hacer NormalizeDouble(Profit,Digits);

Entonces imprimo(" profit=",DoubleToStrMorePrecision(Profit,8));

Como resultado, el registro muestra lo siguiente: "profit=0.88881912". Parece que es 0,88881000, ¿verdad?

¿O tal vez soy estúpido y hago algo mal?

 
goodearth:

Hola a todos.

Acabo de darme cuenta de que NormalizeDouble funciona de forma extraña.

Es decir, el Asesor Experto funciona bien y no tiene errores, pero los registros en el Probador de Estrategias son muy extraños.

Te lo explicaré.

Calculo el beneficio utilizando esta función. Hago lo que creo que debería hacer NormalizeDouble(Profit,Digits);

Entonces imprimo(" profit=",DoubleToStrMorePrecision(Profit,8));

Como resultado, el registro muestra el siguiente mensaje: "profit=0.88881912". Parece que es 0,88881000, ¿verdad?

¿O tal vez soy estúpido y hago algo mal?

¿Tiene un valor de beneficio en las órdenes comerciales?
 
artmedia70:
¿Participa su valor de beneficio en las órdenes comerciales?

Sí, por supuesto. Y sin errores :-). Por eso me sorprendió.

Tengo la construcción 735.

El comercio es en la demo.

¡Aaaaaaaaah lo tengo! He olvidado la operación de asignación:-). "Beneficio=NormalizarDoble(Beneficio,Dígitos)".

Pero sigo sin entender por qué el EA no muestra errores ))

Tal vez el servidor redondea automáticamente .....

Pensé que NormalizeDouble era un procedimiento, no una función :-).

 
Ozero:

Poner ";" detrás de un paréntesis.

El programa funciona, PERO a veces falla con el error 4108.


Ozero.

De hecho, ¡hay que borrarlo!

 
borilunad:

De hecho, ¡debería eliminarse!

Boris, será mejor que le enseñes el código directamente, porque tenía demasiado sueño para recordar... ;)

ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
 
artmedia70:

Boris, será mejor que le enseñes el código directamente, porque tenía demasiado sueño para recordar... ;)

No quería abusar de tus derechos de autor. ;)

Y en serio, ¡algo no se pegó! ¡Pero lo probaré ahora!

ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("");

¡Y ahora está funcionando! ¡Qué raro!

 
Hola

Por favor, denme una solución.

Hay un EA que compila sin errores con la build 500 del editor.

Pero en la nueva versión genera errores. Veo estos errores:

bool TP?=true;   // ошибка  '?' - semicolon expected    
Y este dos veces.

if(TP?)    // ')' - unexpected token    
           // ')' - ':' colon sign expected     
He mirado el manual de la nueva versión y el de la antigua, pero no he encontrado nada sobre el signo de interrogación.

Pregunta: ¿qué significan estas operaciones y cómo corregirlas para que el código compile normalmente?

Gracias de antemano.


 

Hola! Podrían decirme por qué a veces tengo un operador ifle que no funciona.
Aquí hay un ejemplo:

double H3=ObjectGet ("H3 line", OBJPROP_PRICE1);
int start()
{
double price = Bid;
if (price==H3)
{
 Alert ("Урааааа  ", Symbol());
}
return(0);
}

Donde:
H3 es el valor del precio del nivel
precio es el precio actual

El resultado es que el precio alcanza este nivel (a veces incluso se detiene en él), pero la alerta no se dispara.
¿Puede decirme cuál es el error?