Nützliche Funktionen von KimIV - Seite 92

 
alexpert007 >> :

Und hier eine weitere Frage an Igor.

Haben Sie eine separate benutzerdefinierte (oder andere) Funktion erstellt, um die Kauf-/Verkaufsposition umzukehren und umgekehrt, ohne die übliche OrderClose - OrderSend?

Ich bin nicht Igor, aber es gibt eine Standardfunktion OrderCloseBy zum Umdrehen.

 

Hallo, ich brauche Hilfe bei der Lösung eines Problems. Lassen Sie mich versuchen, es zu beschreiben:

Es gibt eine Funktion, die Aufträge zählt:

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

Wenn für das aktuelle Symbol kein Auftrag vorliegt, sollte bei Erfüllung der Bedingung ein Auftrag, z. B. zum Kauf, erteilt werden:

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"",MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Fehler OP_BUY. Der Auftrag wird nicht angenommen. op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1);
}
}
}

Stattdessen kann der obige Code, wenn er mehrere Symbole im Terminal öffnet und einen EA in jedem von ihnen ausführt, beispielsweise eine Order öffnen - das ist korrekt, aber gleichzeitig kann er 20-30 Orders öffnen, bis das Walross ausläuft, wenn die Bedingung mehrere Ticks lang anhält. Ich habe das noch bei keinem einzigen Instrument gesehen, aber ich bin mir auch nicht sicher, dass es nicht bei einem einzigen Instrument passieren wird. Wie kann ich meinen Code so ändern, dass es schwierig ist, nicht mehr als eine Bestellung zu öffnen?

 

Igor, guten Abend,

Ich kann Ihren Funktionsaufruf nicht verwalten:

//+----------------------------------------------------------------------------+
//| Autor: Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Beschreibung: Gibt den Gesamtgewinn der offenen Positionen in der Einzahlungswährung zurück.
//+----------------------------------------------------------------------------+
Parameter: //|
//| sy - Name des Instruments (" - beliebiges Symbol, |
//| NULL - aktuelles Symbol) |
| //| op - Operation (-1 - beliebige Position) |
//| mn - MagicNumber (-1 - beliebige Magie) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0;
int i, k=AuftragSumme();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
wenn ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
zurück(p);
}

Können Sie mir sagen, in dem Aufruf TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. Angenommen, EURUSD, sollte es in Anführungszeichen "EURUSD" sein oder ist es ohne erlaubt;

2. Was sollte der zweite aufrufende Parameter sein (wo ist ein Bindestrich), um den gesamten Kauf- und Verkaufsgewinn zu berechnen (ich habe den Standardwert -1 ausprobiert; nicht korrekt)

3. der dritte Parameter ist die magische Zahl des Expert Advisors? - Ich bin noch nicht dazu gekommen, nur eine Frage, ob ich den Parameter richtig verstehe.

Danke.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- nur für EURUSD

- alle offenen Stellen (-1)

- Positionen mit beliebiger Magie (-1)

 

Guten Tag.

Wie Sie wissen, funktioniert Sleep() im Terminal-Tester nicht, so dass Sie Schleifen aus mathematischen Funktionen verwenden müssen, um die Ausführung zu verzögern:

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

wobei zFILE die Ausführungsverzögerung des Expert Advisors ist.

Meine Frage ist: Gibt es eine anspruchsvollere Lösung, da ich eine Verzögerung von einigen Sekunden bis zu 10-20 Minuten benötige (Verarbeitung der Daten durch ein externes Programm)?

Oder zumindest, wie man Laufzeit genauer zu messen (couse Prozessoren Leistung ist unterschiedlich) und wählen Sie die langsamste ein?





 
Piboli >> :

Frage: Gibt es eine elegantere Lösung (Verzögerungsfunktion), da die Verzögerung von einigen Sekunden bis zu 10-20 Minuten benötigt wird (Datenverarbeitung durch externe Software)?

Haben Sie nicht versucht, Callbacks und Synchronizer zu verwenden?

 

Kims Funktionen

Ich frage mich, ob es eine Funktion gibt, mit der Sie den Namen des letzten Musters abrufen können

und Änderungen in seinen Komponenten aufzeichnen


 

KimIV vielleicht können Sie und schreiben einen Indikator

Der Indikator sollte nach einem flachen Kanal innerhalb einer bestimmten Zeitspanne suchen und nicht breiter sein als in den Einstellungen angegeben

Dieser Indikator sollte den Kanal sowohl innerhalb eines Tages als auch mit Übergang zum nächsten Tag wie in Ihrer Funktion isTradeTimeInt() suchen.
Dieser Indikator kann während eines Tages 5 Kanäle oder nur einen Kanal anzeigen.
In den Einstellungen

extern double maximale Kanalhöhe in Punkten
extern int Bar_Time wie wir das Zeitintervall in Balken (1) oder Stunden und Minuten (2) berechnen
extern string Mindestzeitintervall des Kanals in Stunden und Minuten
extern int int Mindestzeitintervall des Kanals in Takten
extern int maximale Anzahl der gezeichneten Kanäle, die gezeichnet bleiben

Ich hänge einen ähnlichen Indikator an https://www.mql5.com/ru/code an, aber er zeichnet den Kanal in einem streng festgelegten Zeitintervall und sucht nicht von selbst nach einem solchen Kanal. Es sollte nur nach einem Kanal suchen, der die maximale Höhe des Kanals nicht überschreitet und nicht kürzer ist als der minimale Zeitabstand des Kanals.
Wenn wir Bar_Time für die Kanalzeit wählen, wird der Kanal(1) aus der aktuellen Zeit minus der in den Einstellungen angegebenen Zeit berechnet, d.h. 2 Stunden 15 Minuten oder eine andere Zeit. Wenn es 1 Stunde 15 Minuten ist, sucht es nach Max und Min von 23 Stunden 00 Minuten und wenn das Max minus das Min unter der maximalen Kanalhöhe liegt, zeichnet es zwei Max und Min Linien von 23:00 bis 02:15. Außerdem werden Fibo-Ebenen oberhalb und unterhalb des Kanals eingezeichnet.

Wenn wir Bar_Time by number of bars wählen, wird der Kanal vom aktuellen Balken abzüglich der in den Einstellungen angegebenen Anzahl von Balken berechnet, d. h. vom Null-Balken bis zum Null-Balken abzüglich der in den Einstellungen angegebenen Anzahl. Wenn die gewählte Zahl 50 ist, werden die Hochs und Tiefs der letzten 50 Balken ab dem Null-Balken gesucht, und wenn das Hoch minus das Tief nicht mehr als die maximale Kanalhöhe beträgt, werden zwei Linien mit den Hochs und Tiefs von 50 Balken gezeichnet.

Alle Ebenen und Kanaldaten werden in Puffern gespeichert

 

Frage an Igor

Wenn Sie mir ein Codefragment eines Expert Advisors für zwei getrennte Konten (Kauf-Verkauf) geben können, der jedes Konto abfragt (für die Berechnung der Losgröße) und eine Einlage von einem Konto auf ein anderes übertragen und einen Teil davon nach bestimmten Bedingungen abheben kann (z. B. monatlicher oder vierteljährlicher Gewinn - n % davon)

Lassen Sie mich meine Frage präzisieren

1 Expert Advisor arbeitet auf Buy (Abfragezustand von Konto 2) . 6200

2 Expert Advisor eröffnet Verkaufsposition (fordert Kontostand bei 1) ... 8400

Wenn es keine offenen Stellen gibt

1100 von Konto 2 auf Konto 1

Konto 1 - 7300

Konto 2 - 7300

Gesamtbruttoeinlage SD=14600 Maximales Risiko - 10% Maximales Los 0,14

Weitere

Stand: 01.04.09 SD=10000

Stand: 01.07.09 SD=14600

Gewinn=4600

10% = 460

460 auf dem dritten Konto abgezogen

Dankeschön

 

Lieber Igor, hilf mir!

Ich habe a-SimpleTrailing.mqh verbunden .

Ichhabe hinzugefügt, was angegeben war, aber es erscheinen 3 Fehler:

clModifyBuy' - Variable nicht definiert
'clModifySell' - Variable nicht definiert
'ti' - Variable bereits definiert

Was ist zu tun?(



Hier ist, was passt:

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",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(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+
Grund der Beschwerde: