Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 758

 
Ozero:

Führen Sie das ";" hinter die Klammer.

Das Programm funktioniert, aber es schlägt gelegentlich mit Fehler 4108 fehl.


Ozero.

Öffnen Sie die Hilfe, sehen Sie Laufzeitfehler, und wir sehen:

4108

ERR_INVALID_TICKET

Falsche Ticketnummer.

Denken und suchen...

 

Hilfe Menschen brauchen, um den Handel auf jede Währung mit ihren eigenen Aufträgen zu unterscheiden und zu differenzieren + nach der offenen Bestellung, wenn der Preis rollt zurück noch weiter könnte eine weitere Bestellung öffnen die gleiche wie die erste.

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

Hallo zusammen!

Ich habe gerade festgestellt, dass NormalizeDouble seltsam funktioniert.

Das heißt, der Expert Advisor funktioniert gut und hat keine Fehler, aber die Protokolle im Strategy Tester sind sehr seltsam.

Ich werde es erklären.

Ich berechne den Gewinn mit dieser Funktion. Ich tue das, was ich denke, dass NormalizeDouble(Profit,Digits) tun sollte;

Dann drucke ich(" Gewinn=",DoubleToStrMorePrecision(Gewinn,8));

Das Ergebnis ist, dass das Protokoll Folgendes anzeigt: "profit=0.88881912". Es scheint 0,88881000 zu sein, richtig?

Oder bin ich vielleicht dumm und mache etwas falsch?

 
goodearth:

Hallo zusammen!

Ich habe gerade festgestellt, dass NormalizeDouble seltsam funktioniert.

Das heißt, der Expert Advisor funktioniert gut und hat keine Fehler, aber die Protokolle im Strategy Tester sind sehr seltsam.

Ich werde es erklären.

Ich berechne den Gewinn mit dieser Funktion. Ich tue das, was ich denke, dass NormalizeDouble(Profit,Digits) tun sollte;

Dann drucke ich(" Gewinn=",DoubleToStrMorePrecision(Gewinn,8));

Das Ergebnis ist, dass das Protokoll Folgendes anzeigt: "profit=0.88881912". Es scheint 0,88881000 zu sein, richtig?

Oder bin ich vielleicht dumm und mache etwas falsch?

Haben Sie einen Gewinnwert bei Handelsaufträgen?
 
artmedia70:
Nimmt Ihr Gewinnwert an Handelsaufträgen teil?

Ja, natürlich. Und keine Fehler :-). Deshalb war ich auch überrascht.

Ich habe Build 735.

Der Handel erfolgt in der Demo.

Aaaaaaaaaaah, ich hab's! Ich habe den Zuweisungsvorgang vergessen :-). "Gewinn=NormalizeDouble(Gewinn,Stellen)".

Aber ich verstehe immer noch nicht, warum der EA keine Fehler anzeigt ))

Vielleicht dreht der Server automatisch Runden.....

Ich dachte, NormalizeDouble ist eine Prozedur, keine Funktion :-).

 
Ozero:

Setzen Sie ";" hinter eine Klammer.

Das Programm funktioniert, aber es schlägt gelegentlich mit der Fehlermeldung 4108 fehl.


Ozero.

Sie muss sogar gelöscht werden!

 
borilunad:

Sie sollte sogar gestrichen werden!

Boris, du zeigst ihm den Code besser direkt, denn ich war zu müde, um mich zu erinnern... ;)

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

Boris, du zeigst ihm den Code besser direkt, denn ich war zu müde, um mich zu erinnern... ;)

Ich wollte Ihr Urheberrecht nicht missbrauchen! ;)

Und im Ernst, irgendetwas hat nicht gepasst! Aber ich werde es jetzt ausprobieren!

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

Und jetzt hat es geklappt! Das ist seltsam!

 
Hallo

Bitte geben Sie mir eine Lösung.

Es gibt einen EA, der mit dem 500. Build des Editors fehlerfrei kompiliert.

Aber in der neuen Version erzeugt es Fehler. Ich sehe diese Fehler:

bool TP?=true;   // ошибка  '?' - semicolon expected    
Und das hier zweimal.

if(TP?)    // ')' - unexpected token    
           // ')' - ':' colon sign expected     
Ich habe das Handbuch für die neue und die alte Version durchgesehen, aber ich habe nichts über das Fragezeichen gefunden.

Frage: Was bedeuten diese Operationen und wie kann man sie korrigieren, damit der Code normal kompiliert werden kann?

Vielen Dank im Voraus.


 

Hallo! Könnten Sie mir bitte sagen, warum ich manchmal einen ifle-Operator habe, der nicht funktioniert?
Hier ist ein Beispiel:

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

Wobei:
H3 ist der Preiswert des Levels
price ist der aktuelle Preis

Das Ergebnis ist, dass der Preis dieses Level erreicht (manchmal sogar an ihm stoppt), aber der Alarm nicht ausgelöst wird.
Können Sie mir sagen, was der Fehler ist?