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

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

Um auf meine Widder zurückzukommen, was das Schließen einer Position beim Überschreiten einer Indikatorlinie betrifft. Ich denke, der Fehler liegt in dieser Funktion

if(Volumen[0]>1) return;

Ich habe in der Anleitung gelesen, dass wir statt Ticks zu zählen, eine Position bei Erscheinen von Bars öffnen (schließen) können. Ist das möglich? Wenn ja, können Sie mir einen Tipp geben, wie ich es für meine Situation programmieren kann.

 
alexey1979621:

artmedia70

Um auf meine Widder zurückzukommen, was das Schließen einer Position beim Überschreiten einer Indikatorlinie betrifft. Ich denke, der Fehler liegt in dieser Funktion

if(Volumen[0]>1) return;

Ich habe in der Anleitung gelesen, dass wir statt Ticks zu zählen, eine Position bei Erscheinen von Bars öffnen (schließen) können. Ist das möglich? Wenn ja, können Sie uns einen Tipp geben, wie ich es für meine Situation programmieren kann.

Vielleicht wird es nützlich sein:

Die Funktion gibt true zurück, wenn ein neuer Balken auf M15 erscheint

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Bitte um Rat!!!

Ich schreibe ausstehende Aufträge zu einer bestimmten Zeit

{

Offene Zeit definieren

}

if ((condition)==true)//
{
OrderSend ( OP_BUYSTOPP, parameters);// eröffnet eine schwebende BuyStop Order
OrderSend ( OP_SELLSTOP, parameters);// eröffnet eine schwebende SellStop Order
}

Ich glaube, ich habe die Zeit richtig geschrieben; sie wird erkannt, aber aus irgendeinem Grund öffnet sie entweder Sell Stop oder Buy Stop und öffnet nicht zwei Aufträge auf einmal. Ich versuche, zwei schwebende Aufträge unterschiedlichen Typs (Bistop und Sellstop) gleichzeitig und nacheinander zu eröffnen. Die Frage scheint primitiv zu sein, bitte helfen Sie für Dummies).

Um den Code hier korrekt einzufügen, klicken Sie zuerst auf SRC und kopieren Sie dann den Code dorthin.

Wenn ich Sie richtig verstanden habe, muss ich zu einem bestimmten Zeitpunkt einen OP_BUYSTOP und einen OP_SELLSTOP öffnen? Ist es akzeptabel, dass zu diesem Zeitpunkt noch andere Aufträge offen sind? Zum Beispiel gibt es offene Aufträge, aber wir müssen die alten löschen, bevor wir die neuen eröffnen?

 
artmedia70:
Dieser Fehler bezieht sich auf grafische Objekte, nicht auf Aufträge

.
Ganz genau! Der Fehler bezieht sich auf Objekte, aber ich habe keine Objekte in diesem EA...


borilunad:
Guten Abend, Victor! Seltsam, der schwebende Auftrag ist kein Objekt! Vielleicht haben Sie ein Objekt, das bereits hätte gelöscht werden sollen, aber nicht gelöscht wurde!

Guten Tag, Boris! Der Expert Advisor erstellt keine Objekte. Dieser Fehler kommt von der Funktion, die einen schwebenden Auftrag platziert. Hier ist die Version der Funktion (für den Prüfer):

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Wenn kein Auftrag erteilt wurde, bedeutet dies, dass eine Sperre ausgelöst wurde:

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

Dies ist der Block, der einen Fehler meldet.


Hat jemand die Logik verstanden?

 
artmedia70:

Da es keine Antwort auf die Frage gibt, ist hier eine Funktion, die das Ticket des letzten Bestellsatzes zurückgibt:



Danke!!.. genau das, was ich brauche

 
hoz:
Ganz genau! Der Fehler betrifft Objekte, aber ich habe keine Objekte in diesem EA...

Guten Tag, Boris! Der Expert Advisor erstellt keine Objekte. Dieser Fehler kommt von der Funktion, die einen schwebenden Auftrag platziert. Hier ist die Version der Funktion (für den Prüfer):

Wenn der Auftrag nicht erteilt wurde, bedeutet dies, dass eine Sperre ausgelöst wurde:

Dies ist der Block, der den Fehler meldet.

Hat jemand die Logik verstanden?

Überprüfen Sie also Ihre Fehlerprüfung? Da muss irgendetwas nicht in Ordnung sein!
 
borilunad:
Überprüfen Sie also Ihre Fehlerprüfung? Da muss irgendetwas nicht in Ordnung sein!

Heh)) Was gibt es an Boris zu meckern? Es ist alles durchschaubar...

pr ist eine Druckfunktion. Und der Fehler ist bereits eine Standardkonstante. Logischerweise ist das überhaupt nicht hinnehmbar. Wenn Sie noch einen Verdacht bezüglich der pr-Funktion haben, hier ist er:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • Versteht jemand die Logik?


Ist die Partie normalisiert? Gut und überprüfen Sie den Preis.

Sind i_magic, pt, i_distanceFromLastPos global?

 
splxgf:

i_magic, pt, i_distanceFromLastPos sind global?


Ja. Variablen mit i_ sind Eingabevariablen (vom Wort intut, das vom Benutzer geändert werden kann...), und pt ist auch eine globale Variable, die überall sichtbar ist...
splxgf:


  • Versteht jemand die Logik?


Ist die Partie normalisiert? Gut und überprüfen Sie den Preis.


Nein, das Los wurde nicht normalisiert. Im Testgerät ist es nie aufgetreten... Und was hat das Los mit dem Objekt zu tun (Fehler 4200)?
 
hoz:

Gelegentlich, aber nicht ständig, erhalte ich einen 4200-Fehler, wenn ich einen schwebenden Auftrag erteile. Laut der Dokumentation bedeutet dieser Fehler, dass das Objekt bereits existiert:

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

Es stellt sich heraus, dass ein Auftrag dieser Art bereits auf dem Markt ist, wenn der schwebende Auftrag gesendet wird?

Vielleicht erstellt ein anderes Programm ein grafisches Objekt mit demselben Namen, auf das der EA reagiert. Vielleicht müssen Sie die Namen der Objekte ändern.