Nützliche Funktionen von KimIV - Seite 88

 

kombat 17.07.2009 22:13

Addieren Sie, erhalten Sie die Kauf-Sommer 3 Lose und kontern Sie dieses Volumen mit Verkauf 3 Lose.

.......................

Als Option, ja. Wenn jedoch bereits offene Verkaufsaufträge vorliegen, schließt der EA möglicherweise nicht die von Ihnen benötigten Aufträge. Das Problem sollte gelöst werden.

kombat 17.07.2009 22:13.

Aber um Ihre Frage zu beantworten: Ist es möglich, alle Positionen zu schließen?

ja, eins nach dem anderen, es ist ein schnelles Skript, aap! und das war's...

.........................

Das ist es, was ich jetzt benutze. Eine Reihe von Skripten - Sie verwenden dieses und jenes... Ich habe jedoch versucht, meine Strategie in Expert Advisor zu kodieren und bin dabei auf eine Reihe von Schwierigkeiten gestoßen.

 
gince >> :
Ich habe etwas, das nicht funktioniert hier, es bedeutet, dass es nicht schließen keine Fehler.

In der Funktion ClosePositions(), seiner Bibliothek b-Positions.mqh, verwendet KimIV einen Aufruf seiner anderen Funktion ClosePosBySelect(), die die Verwendung von ee im Tester verbietet:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Für Geschichtstests verwenden Sie seine Bibliothek b-ForTest.mqh

 
BoraBo писал(а) >>

In der Funktion ClosePositions(), seiner Bibliothek b-Positions.mqh, verwendet KimIV einen Aufruf seiner anderen Funktion ClosePosBySelect(), die die Verwendung von ee im Tester verbietet:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Für Geschichtstests verwenden Sie seine Bibliothek b-ForTest.mqh

Sie haben meinen Code missverstanden... Übersetzen ins Russische... Wenn NICHT Testmodus UND (EA darf NICHT handeln ODER der Expert Advisor wird gestoppt), dann Schleife abbrechen. Einfach ausgedrückt, sorgt diese Zeile dafür, dass die Schleife verlassen wird, wenn Sie die Schaltfläche "Expert Advisors" in der Symbolleiste drücken.

 
Entschuldigung für die Verwirrung.
 

Guten Abend,

Leider gibt es auch eine Diskrepanz mit dem Array... Wenn die Auftragszählung mit einer Bedingung durchgeführt wird, wenn die Lose größer als 0 sind (Lts>0), werden die Lose einzeln geschlossen (wenn der Gewinn erreicht ist), aber der Gesamtgewinn sollte berücksichtigt werden:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Und bei der Bedingung in der Auftragszählung, wenn die Lose mehr als 1 sind (Lts>1), werden die Lose nicht geschlossen:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Bitte teilen Sie mit, wer den Fehler sehen kann.

Oder vielleicht, Igor, habe ich ein Missverständnis bei der Verwendung Ihrer Funktion?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Funktion aufrufen

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

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

Igor, bitte sagen Sie mir, wie ich Ihre Funktion PriceOpenLastPos in den Indikator einfügen kann.

Beim Kompilieren gibt der Editor einen Fehler bei der ersten Klammer und den nachfolgenden Variablen aus.

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}

'(' - Funktionsdefinition unerwartet D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - Variable nicht definiert D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
usw.

Ich implementiere die Logik der Handelssignalbildung in einem Indikator und sende das generierte Signal über eine globale Variable an den Expert Advisor, um Aufträge zu öffnen/zu schließen.

Ich benötige den Eröffnungskurs eines Auftrags, um einige Entscheidungen zu treffen, also versuche ich, das zu tun. Mein Indikator ist ein dynamischer Indikator und kann nur im Demomodus oder im Visualisierungsmodus eines Testers getestet werden.

 

Dabei wird nicht der Gesamtgewinn berücksichtigt, sondern der Gewinn der einzelnen Aufträge.

 
Angela, der Compiler hat nicht erwartet, meine Funktionsdefinition an dieser Stelle zu finden. Das bedeutet, dass irgendwo weiter oben im Code etwas fehlt. Vielleicht ein Semikolon oder eine schließende geschweifte Klammer. Prüfen Sie den Code auf jeden Fall sorgfältig.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Funktionsaufruf

Falsche Parameterübergabe an die Funktion. Das sollte so sein:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Falsche Parameterübergabe an die Funktion. Das sollte so sein:

Das Hinzufügen einer Bindung an das Symbol im Funktionsaufruf ist nicht hilfreich. Warum wird der Gewinn für jede Position separat gezählt (Bild oben)?