Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 758

 
Ozero:

Passare il ";" dietro la staffa.

Il programma funziona, MA a volte fallisce con l'errore 4108.


Ozero.

Aprire l'aiuto, vedere gli errori di runtime, e vediamo:

4108

BIGLIETTO ERRATO_INVALIDO

Numero di biglietto errato.

Pensa e cerca...

 

Le persone di aiuto hanno bisogno di commerciare su ogni valuta con i propri ordini per distinguere e differenziare + dopo l'ordine aperto se il prezzo rotola indietro ancora più lontano potrebbe aprire un altro ordine uguale al primo.

//+------------------------------------------------------------------+
//|                                                  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);
  }
// конец.
 

Ciao a tutti!

Ho appena notato che NormalizeDouble funziona in modo strano.

Cioè, l'Expert Advisor funziona bene e non ha errori, ma i log nello Strategy Tester sono molto strani.

Vi spiegherò.

Calcolo il profitto utilizzando questa funzione. Faccio quello che penso dovrebbe fare NormalizeDouble(Profit,Digits);

Poi stampo(" profitto=",DoubleToStrMorePrecision(Profit,8));

Come risultato, il log mostra il seguente: "profit=0.88881912". Sembra essere 0,88881000, giusto?

O forse sono stupido e faccio qualcosa di sbagliato?

 
goodearth:

Ciao a tutti!

Ho appena notato che NormalizeDouble funziona in modo strano.

Cioè, l'Expert Advisor funziona bene e non ha errori, ma i log nello Strategy Tester sono molto strani.

Vi spiegherò.

Calcolo il profitto utilizzando questa funzione. Faccio quello che penso dovrebbe fare NormalizeDouble(Profit,Digits);

Poi stampo(" profitto=",DoubleToStrMorePrecision(Profit,8));

Come risultato, il log mostra il seguente: "profit=0.88881912". Sembra essere 0,88881000, giusto?

O forse sono stupido e faccio qualcosa di sbagliato?

Avete un valore di profitto negli ordini commerciali?
 
artmedia70:
Il vostro valore di profitto partecipa agli ordini commerciali?

Sì, certo. E nessun errore :-). Ecco perché sono rimasto sorpreso.

Ho la Build 735.

Il trading è sulla demo.

Aaaaaaaaah ho capito! Ho dimenticato l'operazione di assegnazione:-). "Profit=NormalizeDouble(Profit,Digits)".

Ma ancora non capisco perché l'EA non mostra errori ))

Forse il server arrotonda automaticamente.....

Pensavo che NormalizeDouble fosse una procedura, non una funzione :-).

 
Ozero:

Mettere ";" dietro una parentesi.

Il programma funziona, MA ogni tanto fallisce con l'errore 4108.


Ozero.

Infatti, deve essere cancellato!

 
borilunad:

In effetti, dovrebbe essere cancellato!

Boris, è meglio che gli mostri direttamente il codice, perché avevo troppo sonno per ricordare... ;)

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

Boris, è meglio che gli mostri direttamente il codice, perché avevo troppo sonno per ricordare... ;)

Non volevo abusare del tuo copyright! ;)

E seriamente, qualcosa non si è attaccato! Ma lo proverò ora!

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

E ora ha funzionato! Che strano!

 
Ciao

Per favore, datemi una soluzione.

C'è un EA che compila senza errori con la 500esima build dell'editor.

Ma nella nuova versione genera errori. Vedo questi errori:

bool TP?=true;   // ошибка  '?' - semicolon expected    
E questo due volte.

if(TP?)    // ')' - unexpected token    
           // ')' - ':' colon sign expected     
Ho cercato nel manuale della nuova versione e di quella vecchia, ma non ho trovato nulla sul punto interrogativo.

Domanda: cosa significano queste operazioni e come correggerle per rendere il codice compilabile normalmente?

Grazie in anticipo.


 

Ciao, potresti dirmi perché a volte ho un operatore ifle che non funziona.
Ecco un esempio:

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

Dove:
H3 è il valore del prezzo del livello
price è il prezzo corrente

Il risultato è che il prezzo raggiunge questo livello (a volte si ferma anche ad esso), ma Alert non si attiva.
Puoi dirmi qual è l'errore?