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

 
alexey1979621:
Danke, habe deinen Code auseinandergenommen. Es gibt tatsächlich einen Fehler beim Öffnen (mein Auge ist bereits klatschnass). Ich habe den modifizierten EA in eine Demo gestellt, wo es bereits offene Positionen auf unserem Meijic mit insgesamt positivem Gewinn gibt. Die Stelle wurde jedoch nicht geschlossen.

Ich sehe, dass im neuen Code (der unten im Beitrag steht) der Standardparameter, der an die Funktion übergeben wird, geändert wurde:

int NumberOfPositions(string sy="", int op=-1, int mn=1114)

Die Originalversion hatte eine andere Magik. Ich habe den Verweis auf diese Funktion in meinem Code korrigiert. Schauen Sie nach, welche Magik-Aufträge jetzt offen sind und stellen Sie diese Anzahl der Magik in Ihrem EA ein.

P.S. Und die Verwendung unterschiedlicher Kodierungen bei der Benennung von Variablen ist kein Zeichen von guter Form... Ich meine:

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Sehen Sie sich diese Zeile an

else if (Auftragsart = OP_SELL()

Und das hier.

if (order_type = OP_BUY)
 
TarasBY:

Ich sehe, dass im neuen Code (der unten im Beitrag steht) der Standardparameter, der an die Funktion übergeben wird, geändert wurde:

Die Originalversion hatte eine andere Magik. Ich habe den Verweis auf diese Funktion in meinem Code korrigiert. Schauen Sie nach, unter welchem Magik die Aufträge jetzt offen sind und geben Sie diese Magik-Nummer in Ihren EA ein.


Nein, die Magie ist korrekt, die für EURAUDUSD ist 1111 und die für EURUSD_GBPUSD ist 1114 (eine andere Person hat mir geholfen, es zu korrigieren). Beide Geschäfte werden nicht abgeschlossen. Ich beobachte die Gesamtgewinne von EURUSD_GBPUSD, aber mein Expert Advisor ist nicht in der Lage, ihn zu schließen. Ich habe Ihre Version für EURAUD_AUDUSD - 1111 für EURUSD_GBPUSD - 1114 überarbeitet, es schließt immer noch keine Geschäfte. Die Besonderheit der Eule ist, dass ich sie nicht im Tester testen kann (weil zwei Paare gehandelt werden) - nur auf einer Demo.
 
alexey1979621:

Nein, der Magier ist korrekt, der für EURAUD_AUDUSD ist 1111 und der für EURUSD_GBPUSD ist 1114 (eine andere Person hat mir geholfen, es zu korrigieren). Beide Geschäfte werden nicht abgeschlossen. Ich beobachte die Gesamtgewinne von EURUSD_GBPUSD, aber mein Expert Advisor ist nicht in der Lage, ihn zu schließen. Ich habe Ihre Version für EURAUD_AUDUSD - 1111 für EURUSD_GBPUSD - 1114 überarbeitet, es schließt immer noch keine Geschäfte. Die Besonderheit der Eule ist, dass man sie nicht im Tester testen kann (weil zwei Paare gehandelt werden) - nur auf einer Demo.


Lassen Sie uns einige Änderungen vornehmen. Anstelle von

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

setzen.

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
Führen Sie den EA aus, setzen Sie den Gewinn auf Null und sehen Sie nach, was herausgekommen ist und was in den Protokollen steht.
 
Roger:


Sehen Sie sich diese Zeile an

else if (Auftragsart = OP_SELL()


Danke!)
 
alexey1979621:

Nein, laut Majik ist alles korrekt, die für EURAUD_AUDUSD ist 1111 und die für EURUSD_GBPUSD ist 1114 (eine andere Person hat geholfen, das zu korrigieren). Beide Geschäfte werden nicht abgeschlossen. Ich beobachte die Gesamtgewinne von EURUSD_GBPUSD, aber mein Expert Advisor ist nicht in der Lage, ihn zu schließen. Ich habe Ihre Version für EURAUD_AUDUSD - 1111 für EURUSD_GBPUSD - 1114 überarbeitet, es schließt immer noch keine Geschäfte. Die Besonderheit der Eule ist, dass man sie nicht im Tester testen kann (weil zwei Paare gehandelt werden) - nur auf einer Demo.

Erstens: Sie sprechen den Indikator nicht richtig an. Dieser Indikator hat eine Vielzahl von externen Parametern:

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

und sie müssen aufgeführt werden, wenn Sie den Indikator aufrufen. Wenn Sie sie weglassen, werden die Parameter standardmäßig übernommen, und da Sie sie für verschiedene Währungspaare verwenden wollen, ist diese Option nicht geeignet. Und alles andere kann unter Berücksichtigung der Änderungen der Parameter beim Start des EA erfolgen:

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  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) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

Lesen Sie hier über den Aufruf des Indikators.

 
Roger:


Lassen Sie uns einige Änderungen vornehmen. Anstelle von

setzen.

Führen Sie den EA aus, setzen Sie den Gewinn auf Null und sehen Sie nach, was herausgekommen ist und was in den Protokollen steht.


Das Ergebnis ist hässlich. Mit Ihren Änderungen und einem Gewinn von 0, hat der Expert Advisor alle Positionen auf Meijic 1111, 1112, 1113, 1114, 1115 geschlossen. Dann, nach 5 Sekunden, wurden neue Aufträge für diese Meijic-Symbole eröffnet, und nach 10 Sekunden wurden sie alle geschlossen, und das Gleiche passierte noch einmal. Die Positionen wurden nicht paarweise eröffnet, sondern chaotisch.
 
alexey1979621:

Das hat sich als beängstigend herausgestellt. Mit Ihren Änderungen und Gewinn gleich 0, schloss der EA alle Positionen auf Majic 1111, 1112, 1113, 1114, 1115 überhaupt. Dann, nach 5 Sekunden, wurden neue Aufträge für diese Meijic-Symbole eröffnet, und nach 10 Sekunden wurden sie alle geschlossen, und das Gleiche passierte noch einmal. Die Positionen wurden nicht paarweise eröffnet, sondern chaotisch.


Meine Leitfrage lautet: Wie viele EAs haben Sie in diesem Konto?

Und Sie hatten eine Bedingung - alle Aufträge mit Gewinn zu schließen.

PS Sie haben gesehen, dass Sie mit diesem EA in eine Falle tappen - er öffnet immer wieder Aufträge nach dem Schließen, was schließlich zu einem Verlust führt. Sie müssen also ein Kennzeichen setzen, das die Erteilung neuer Aufträge verbietet, bis die Bedingungen vorüber sind und erneut auftreten.

 
TarasBY:

Erstens: Sie sprechen den Indikator nicht richtig an. Dieser Indikator hat eine Vielzahl von externen Parametern:

und sie müssen aufgeführt werden, wenn Sie den Indikator aufrufen. Wenn Sie sie weglassen, werden die Parameter standardmäßig übernommen, und da Sie sie für verschiedene Währungspaare verwenden möchten, ist diese Option nicht geeignet. Und alles andere kann unter Berücksichtigung der Änderungen der Parameter beim Start des EAs erfolgen:

Wie Sie den Indikator aufrufen, können Sie hier nachlesen.

Ich danke Ihnen. Ich weiß über den Indikatoraufruf Bescheid. Da dieser EA nicht im Tester getestet werden kann (weil zwei Paare gehandelt werden), ist es unmöglich, diese Parameter in der Historie zu wählen. Ihre letzte Variante ist bereits in einer Demo umgesetzt, ich werde sehen, wie die Trades abschließen werden. Noch eine kleine Frage: Bei zwei Instrumenten werden die Geschäfte entweder mit "Kaufen" oder "Verkaufen" eröffnet. Wenn wir ein Instrument mit "Verkaufen" und ein anderes mit "Kaufen" eröffnen wollen, was sollen wir dann tun? Ich habe herumgestöbert, kein Glück ..... Nochmals herzlichen Dank für Ihre harte Arbeit.
 
Roger:


Eine Leitfrage - wie viele EAs haben Sie in diesem Konto?

Und Sie hatten eine Bedingung - alle Aufträge mit Gewinn zu schließen.

PS Sie haben gesehen, dass Sie mit diesem EA in eine Falle tappen - er öffnet immer wieder Aufträge nach dem Schließen, was schließlich zu einem Verlust führt. Sie müssen also ein Kennzeichen setzen, das die Erteilung neuer Aufträge verbietet, bis die Bedingungen vorüber sind und erneut auftreten.


Die Expert Advisors arbeiteten für 5 (Zwillingsbrüder - für verschiedene Paare), natürlich mit unterschiedlichen Meijic.


Ja, wir hatten die Gewinnbedingung, um die Aufträge zu schließen, aber die Aufträge waren mit einem bestimmten EA verbunden, zum Beispiel mit MAJIC 1114. Ich habe von Anfang an darüber geschrieben und geglaubt, dass die Eule ihre eigenen Aufträge beim Abschluss nicht sieht; es hat sich herausgestellt, dass sie alle Aufträge sieht und sie unbedingt abschließen will, aber wir brauchen nicht alle, sondern nur einige bestimmte.

Wenn wir die H4-Periode nehmen, wenn die Indikatorlinien höher als 0,1 und niedriger als -0,1 sind, ist die Bedingung erfüllt und die Geschäfte werden eröffnet, d.h. es ist möglich, mehrere Gewinne auf ein Signal hin mitzunehmen (obwohl es eine Option gibt, Geschäfte zu schließen, wenn die Indikatorlinien konvergieren).