Fehler, Irrtümer, Fragen - Seite 1521

 
Ilya Malev:
Fügen Sie den Text in das OnCalculate des im Redakteur erstellten Standardindikators ein. Platzieren Sie es auf einer beliebigen Karte. Die Funktion des Indikators wird in der oberen linken Ecke des Chart-Fensters angezeigt. Nachdem Sie "Löschen" aus der Liste der Indikatoren ausgewählt haben, wird die Funktion nicht unterbrochen, sondern Sie sehen sie in der oberen linken Ecke. Sie wird auch nach dem Schließen des Fensters fortgesetzt. Nach dem Öffnen eines neuen Fensters wird es in dem neuen Fenster fortgesetzt. Dieses Fenster hat nicht unbedingt das gleiche Symbol wie das, das Sie am Anfang hatten :)
Die Arbeit des Anzeigers endet erst, wenn das Terminal geschlossen wird. Und ich weiß nicht, ob er anhält oder nicht - ich musste nur das Terminal manuell über den Task-Manager entfernen, um es neu zu starten...

Gleichzeitig besagt die Hilfe der IsStopped-Funktion, dass der Programmbetrieb nach 3 Sekunden zwangsweise beendet wird, wenn es einen Befehl zum Beenden des mql-Programms gibt.

Und wenn while(true) durch while(!IsStopped()) ersetzt wird, wird der Indikator erfolgreich beendet, wenn er aus dem Diagramm entfernt wird.

Alles ist klar. Wir haben eine Nachsicht für die normale Löschung gewährt.

Wenn sich das Terminal schließt, wird es hart sein. Nicht mehr als 3 Sekunden.

Und ich bin mir nicht sicher, ob wir dies in die Dokumentation schreiben werden, 1. um nicht in das Schreiben solch unbedachter Indikatoren zu verfallen (haben Sie dies geschrieben, um zu überprüfen?) 2. Wie gelockert, so gestrafft.

 
Alexandre:

Eine lustige Ursache für den internen Compiler-Fehler (Funktion, die im Indikator verwendet wird):

...

Die Lösung liegt auf der Hand, aber ich stimme zu - eine sehr lustige Panne. :)))

Vielen Dank für diesen Beitrag!

Ich habe Ihnen eine private Nachricht geschrieben.
 
Hallo. Ich schaffe es nicht, einen Code zu schreiben, der eine Position inn-Balken-Anzahl eröffnet, nachdem die vorherige Position eröffnet wurde. Versucht mit Time[i], iBarShift, iTime. Ich hatte mit all dem kein Glück. Ich bin ein Anfänger in der Programmierung. Die Suche hat nichts ergeben.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Hallo, damit Sie Hilfe bei der Fehlersuche bekommen, müssen Sie zumindest den Code anhängen. Niemand hier wird für Sie schreiben - es ist hier üblich, Ihnen zu helfen, den Fehler zu finden und ihn mit Ratschlägen zu korrigieren. Oder - kontaktieren Sie einen Freiberufler.
 

Hier ist der Code:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ich habe es auch auf diese Weise versucht:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Zeit[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //als Beispiel habe ich hier 2700 Sekunden anstelle von n angegeben, was im Test 3 15-Minuten-Kerzen bedeutete) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Und auch so:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Zeit[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //In diesem Fall, wenn ich 2700 entfernt habe, wurde der zweite Handel direkt nach dem ersten im gleichen Takt eröffnet, das macht Sinn. Und selbst wenn ich einen beliebigen Wert bis 600 anstelle von 2700 einstellte, wurde das zweite Geschäft in derselben Leiste geöffnet. Bei einem Wert von mehr als 600 wurde der zweite Handel nie eröffnet. Ich kann nicht verstehen, was das Problem ist. Ich wäre Ihnen für Ihre Hilfe sehr dankbar.

Die Parameter Timer und TimerNull haben das Format datetime.


 

in Ihrem Beispiel gibt es keine Aufzählung von z.B. Positionen

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))

Daher wählt es immer die Position 0.

 
Ich bin noch dabei, einen groben Entwurf zu schreiben, damit die grundlegende Logik funktioniert. Danach werde ich es verfeinern. In diesem Fall kann ich mich irren, das Problem liegt im zweiten Teil des Codes.
 
Slawa:

Das macht alles Sinn. Es wurde ein Nachlass für die normale Löschung gewährt.

Wenn Sie das Terminal schließen, wird es hart sein. Nicht mehr als 3 Sekunden.

Und ich bin mir nicht sicher, ob wir dies in die Dokumentation schreiben werden, 1. um nicht in das Schreiben solch unbedachter Indikatoren zu verfallen (haben Sie dies geschrieben, um zu überprüfen?) 2. Wie gelockert, so gestrafft.

Ziehen Sie es also schon an, oder korrigieren Sie den Verweis. Nachgeben und nicht nachgeben ist kein ernsthaftes Thema. Was Programmierer von Ihnen erwarten, ist keine "Bevormundung", sondern klare, gut dokumentierte Software.

Natürlich hat dieser Code keinen anderen Zweck als eine Demonstration, um die Sie selbst gebeten haben. Und es ist ganz harmlos, harmlos, es zu bekommen, wenn man Sleep entfernt und Comment durch Print ersetzt. Weder in Quartet noch in Quartet 5 gibt es einen Schutz gegen das Einspammen von Gigabytes an Druckdaten in das Protokoll.

 
Dmitri Custurov:

Hier ist der Code:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Ich habe es auch auf diese Weise versucht:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Zeit[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //als Beispiel habe ich hier 2700 Sekunden anstelle von n angegeben, was im Test 3 15-Minuten-Kerzen bedeutete) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Und auch so:

if ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Timer=Time[0];}

TimerNull=Zeit[0];

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); //In diesem Fall, wenn ich 2700 entfernt habe, wurde der zweite Handel direkt nach dem ersten im gleichen Takt eröffnet, das macht Sinn. Und selbst wenn ich einen beliebigen Wert bis 600 anstelle von 2700 einstellte, wurde das zweite Geschäft in derselben Leiste geöffnet. Bei einem Wert von mehr als 600 wurde der zweite Handel nie eröffnet. Ich kann nicht verstehen, was das Problem ist. Ich wäre Ihnen für Ihre Hilfe sehr dankbar.

Die Parameter Timer und TimerNull haben das Format datetime.


Dies ist eine der möglichen Implementierungen. Dieser EA sollte eine Order nach der angegebenen Anzahl von Bars eröffnen. Und lernen Sie, wie man EA-Code richtig einfügt, nämlich über die SRC-Schaltfläche in der Nachrichtenleiste.

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

Die Frage richtet sich wahrscheinlich an die Entwickler von Websites oder an die Administratoren von Freelance-Diensten

---

Früher: 568 abgeschlossene Aufträge, 75% persönlich

13 Jobs hinzugefügt (alle persönlich) und wurde: 581 erledigt, 75% persönlich

---

Daher die Frage: entschlüsseln Sie bitte, was 75% bedeutet?

Grund der Beschwerde: