[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 317

 
enya:

.

Probleme mit dem Zyklus und der Wiederherstellung der Ausgangswerte nach Beendigung des Zyklus

Hier ist die Funktion, die beantwortet, ob der letzte Handel profitabel oder unprofitabel war:

 double LastOrderProfit()
 {
   double Profit=0;
   int ticket; 
   for(int i=0; i<OrdersHistoryTotal(); i++){
     if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()!=Symbol())continue;
     if(OrderMagicNumber()!=Magic)continue;
     if(OrderType()>1)continue;
     if(ticket<OrderTicket()){
        ticket=OrderTicket();
        Profit=OrderProfit()+OrderSwap()+OrderCommission();
     } 
   }     
 return(Profit);
 } 

Durch den Vergleich der Antwort mit Null entscheiden Sie dann, ob Sie TP/SL beibehalten oder ändern wollen.

 if(LastOrderProfit()>0) newTPSL=false; else  newTPSL=true;
if(newTPSL)OrderModify(.......newSL,newTP...);
 

Hallo zusammen. Ich interessiere mich für den IN10TION NewsReader Indikator. Ich möchte es an meinen EA anhängen.

Wenn eine rote Linie erscheint (Market.TdOpen) und Market.Price.DOWN(red) dann verkaufen

Wenn eine rote Linie erscheint (Market.TdOpen) und Market.Price.UP(green) dann kaufen

Welche Maßnahmen kann ich ergreifen? iCustom habe ich ausprobiert, aber es funktioniert nicht!


extern bool Market.TdOpen = TRUE;
extern color Market.TdOpen.Color = Red;
extern bool Market.TdFibo = TRUE;
extern color Market.TdFibo.Color = C'0x00,0x32,0x00';
extern color Market.Price.UP = Lime;
extern color Market.Price.DOWN = Red;
extern bool Market.Price.Guide = TRUE;

Beigefügte Dateien:
_yIN10TIONfNewsReaderov09.99kblite.ex4 (115.59 KB) löschen

 

Ich entschuldige mich bei den Administratoren, dass ich mich wiederhole, aber bisher hat noch niemand auch nur ein Wort zu mir gesagt. Die Idee ist, in den Protokollen gespeicherte Meldungen auszugeben, d.h. solche, die von der Funktion IsConnected() nicht korrekt behoben werden können - Verbindungsabbrüche, Anfragen. Ansonsten ist nicht klar, warum der EA im Moment nichts tut.


Bitte schlagen Sie den folgenden Code vor, um die Protokolldatei zu lesen. Liest automatisch die aktuelle Protokolldatei nach Datum und gibt sie auf dem Drucker aus.

Wo:

while (result>0) {

Eine Akte wird aus Teilen zusammengesetzt. Ich benötige aber nicht die gesamte Datei, sondern nur die letzte Zeile. Helfen Sie bitte, ihn zu korrigieren.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 

Brauche Hilfe beim Ändern eines EA

Der Expert Advisor sollte auf der Rückseite handeln.

Anstelle von Verkaufslimitaufträgen kaufen

und Kauf-Limit-Aufträge verkaufen

Dateien:
tke.mq4  18 kb
 
mersi:

Hier ist die Funktion, die beantwortet, ob der letzte Handel profitabel oder unprofitabel war:

Durch den Vergleich der Antwort mit Null können Sie dann entscheiden, ob Sie TP/SL beibehalten oder ändern wollen.

Ist Ihre Funktion sicher, dass sie die letzte Bestellung zurückgibt? Oder wird sie die erste Bestellung zurückschicken , die nicht verloren wurde? Warum befindet sich ein Häkchen auf dem Ticket?

Ich würde es so machen:

//+----------------------------------------------------------------------------+
double LastOrderProfit() {
   double Profit=0;
   datetime t;
   int i, j;
   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderMagicNumber()!=Magic)                  continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderType()>1)                              continue;
      if (t<OrderCloseTime()) {
         t=OrderCloseTime();
         j=i;
         }
      }
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
   return(Profit);
} 
//+----------------------------------------------------------------------------+

Dies ist eine Umgestaltung Ihrer Funktion, um genau den letzten abgeschlossenen Auftrag zu finden.

Sie hat den Nachteil, dass sie Null zurückgibt, wenn überhaupt keine abgeschlossenen Aufträge vorhanden sind. Somit ist es unmöglich, mit Sicherheit zu wissen, ob es in der Historie abgeschlossene Aufträge gibt oder nicht. Schließlich bedeutet die zurückgegebene Null nicht, dass es überhaupt keinen Auftrag gibt, sondern dass er bei Null abgeschlossen ist.

 

Bitte beraten Sie mich:

ist an der Darstellung des Indikatorwerts nur interessiert für zuletzt (aktuell) bar. Wenn jedoch ein neuer Balken geöffnet wird, bleiben die alten Werte im Diagramm erhalten.... Wie kann ich diesen Müll mit Gewalt entfernen? Ist es möglich, die Bedingung festzulegen, dass für den Takt [0] die Indikatorwerte berechnet und angezeigt werden, und für die Takte von [1] bis [Takt-1] diese Werte zurückgesetzt werden?

double Buffer [1];            

int init()
  {

   IndicatorBuffers(1);
  
   SetIndexStyle(0,DRAW_ARROW);
   .........
 
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) counted_bars=0;
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
       for(int i=limit;i>=0;i--) 
     {
         Buffer [0] = ............;
     }
   return(0);
  }        
 

artmedia70:

Sie hat den Nachteil, dass sie Null zurückgibt, wenn überhaupt keine Aufträge abgeschlossen wurden. Somit ist es unmöglich, mit Sicherheit zu wissen, ob es in der Historie abgeschlossene Aufträge gibt oder nicht. Schließlich bedeutet die zurückgegebene Null nicht, dass es überhaupt keinen Auftrag gibt, sondern dass er mit Null abgeschlossen wurde.

Ich danke Ihnen! Obwohl Sie mir nicht geantwortet haben, haben Sie meine vorherige Frage nach der korrekten Berechnung des Gewinns beantwortet:

Profit=OrderProfit()+OrderSwap()+OrderCommission();
 
Azerus:

Bitte beraten Sie mich:

ist an der Darstellung des Indikatorwerts nur interessiert für zuletzt (aktuell) bar. Wenn jedoch ein neuer Balken geöffnet wird, bleiben die alten Werte im Diagramm erhalten.... Wie kann ich diesen Müll mit Gewalt entfernen? Ist es möglich, die Bedingung festzulegen, dass für den Takt [0] die Indikatorwerte berechnet und angezeigt werden, und für die Takte von [1] bis [Takt-1] diese Werte zurückgesetzt werden?

Initialisieren Sie zu Beginn von Start() den Puffer mit dem Wert EMPTY_VALUE. Das heißt, tun Sie es mit dem Erscheinen eines neuen Balkens, überprüfen Sie die Öffnungszeit des Nullbalkens und tun Sie Ihre Müllbeseitigungslogik.

 
artmedia70:

Ist Ihre Funktion sicher, dass sie die letzte Bestellung zurückgibt? Oder ist der erste, der gefunden wird, nicht unrentabel? Warum befindet sich ein Häkchen auf dem Ticket?

Ich würde es so machen:

Dies ist eine Umwandlung Ihrer Funktion, um genau den letzten geschlossenen Auftrag zu finden.

Sie hat einen Nachteil - wenn es überhaupt keine abgeschlossenen Aufträge gab, wird sie Null zurückgeben. Daher können wir nicht mit Sicherheit wissen, ob es in der Historie abgeschlossene Aufträge gibt oder nicht. Die zurückgegebene Null bedeutet nicht, dass der Auftrag überhaupt nicht existiert, sondern dass er mit Null abgeschlossen wurde.

1. Die Funktion findet den Auftrag mit dem größten Ticker in der Historie, d.h. den letzten geschlossenen Auftrag (es sei denn, wir nehmen einen Ausnahmefall an, für den Ihre Variante mit dem maximalen Zeitpunkt des Abschlusses vorzuziehen ist).

2. Je nach Auftrag muss der erste Auftrag mit dem angegebenen TP/SL eröffnet werden, und nur der zweite Auftrag kann mit dem neuen TP/SL eröffnet werden, was bedeutet, dass die Funktion nur dann Null zurückgeben kann, wenn der erste Handel Null war, aber nicht, wenn es keine geschlossenen Aufträge in der Historie gibt.

Eine letzte Sache. In Ihrer Variante ist die Verwendung von j und einem weiteren SELECT in der Funktion redundant.

Es ist genug:

 if (t<OrderCloseTime()) {
         t=OrderCloseTime();
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
  }
   return(Profit);
 
snail09:
Zu Beginn von Start() wird der Puffer mit dem Wert EMPTY_VALUE initialisiert.


Wie kann das sein? In den Einstellungen der Indikatorzeile nach int init() habe ich Folgendes

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,165);                     
   SetIndexBuffer(0,Buffer);
   SetIndexEmptyValue(0,0.0);