Nützliche Funktionen von KimIV - Seite 86

 

Igor, kannst du mir einen Tipp geben? Etwas vom Indikator(iMA) im EA kommen die Werte mit 4 Nachkommastellen, während ich 5 für die Arbeit brauche! Ich habe NormalizeDouble(iMA,Digits) ausprobiert - es sind immer noch 4 Dezimalstellen. Ist es notwendig, den gesamten Indikator in eine Unterprogrammfunktion des Expert Advisors umzuschreiben, um 5 Stellen zu erhalten?

 

Hilfe: Alert(), Comment(), Print()

Daten vom Typ Double werden mit 4 Dezimalstellen nach dem Punkt ausgegeben.

Verwenden Sie DoubleToStr(), um Zahlen mit größerer Genauigkeit auszugeben.

 

Guten Abend,

Ich komme mit dem korrekten Schließen von Positionen nicht zurecht. Es gibt zwei Bedingungen für die Schließung: 1. wenn eine Position offen ist; 2. wenn zwei (oder mehr) Positionen offen sind. In beiden Fällen ist das Losvolumen = 0,03. Im ersten Fall wird das Los separat um 0,01 geschlossen (wie in den obigen Beiträgen berechnet). Im zweiten Fall sollten zwei Lose jeweils um 0,03 geschlossen werden:

if (OrderType()==OP_BUY && BuyTotalOp==1)

dann die erste Variante von Schließen und wenn:

if (OrderType()==OP_BUY && BuyTotalOp>1)

dann die andere (in meiner Variante (vorläufig), wenn die Summe der Gewinne beider Positionen > 0 ist, dann sollten beide Positionen geschlossen werden). Es sieht so aus:

   extern double Lots=0.03;           // Жестко заданное колич. лотов
.................................
   // Учёт количества имеющихся ордеров
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
......................................
   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
     }
//.........................................
   //Проверка если открыта одна БАЙ-позиция
   if (OrderType()==OP_BUY && BuyTotalOp==1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия одного лота БАЙ
      if ( BUYCLOSE_1PART && BuyClLot== Lots)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
 

Tatsächlich stellt sich heraus, dass, wenn die Bedingungen für das Schließen beider Lose auftreten, das erste Los vollständig geschlossen wird, während das zweite Los die Schließungsbedingungen BuyTotalOp==1 "übernimmt" und nach seinen eigenen Bedingungen schließt.

Bitte teilen Sie mir mit, was mit den Abschlussbedingungen nicht stimmt und wie man beide Lose auf einmal abschließen kann? Vielen Dank im Voraus.

 
Ich habe sowohl OrderTicket() als auch Lots counting und plusing in der Bestellschleife ausprobiert - ohne Erfolg... Vielleicht ist, wie immer, "die Wahrheit irgendwo in der Nähe", aber sie kommt nicht an...
 

Trennen Sie die Fliegen von den Koteletts... schreiben Sie einige nützliche Funktionen...

Zählen Sie zum Beispiel die Anzahl der offenen Aufträge nach Auftragsart, die abgeschlossenen Aufträge nach Auftragsart usw..

dann wird alles einfacher sein...

if ( ordersTotal( SYMBOL,OP_BUY)==1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);
if ( ordersTotal( SYMBOL,OP_BUY) > 1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);

...denn irgendwo fehlt eine }, und es wird unklar, was genau gemacht wird...vielleicht versuchen Sie, vorübergehend die Anzahl der Aufträge zu zählen und sie sofort zu löschen, oder was ? schwebende Aufträge sollten besser übersprungen und nicht unterbrochen werden, wenn sie existieren ?

Eine gute Option wäre eine Funktion, die nach gegebenen Bedingungen ein Array mit Parametern von offenen Aufträgen bilden würde, die Sie durchlaufen und schließen können ... im Allgemeinen, arbeiten Sie an der Struktur ...

 

Danke, keekkenen, ich habe in letzter Zeit über die Erstellung eines Arrays nachgedacht. Es ist nur so, dass ich noch nie damit gearbeitet habe und gehofft habe, dass es eine einfachere Lösung gibt, dass ich schon ein "geschlossenes" Auge habe, und dass jemand mit frischen Augen darauf schaut und sagt "Mensch, wo ist dein Zählen so-und-so...". Nun, alle Kaufaufträge in der Schleife sind berechnet worden:

   // Учёт количества имеющихся ордеров от начала к концу
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
....................................

und OrderClose zählt sie nicht...

   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);          // Закрытие Buy
...................................................................
Nun, ja, es ist offensichtlich ein "Overkill" .......
 

und offen gesagt, verstehe ich das nicht.

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy

und diese, insbesondere die Teilung des Loses durch 3 ? der Auftrag wird mit demselben Los geschlossen, mit dem er eröffnet wurde...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

warum nicht in beiden Fällen?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy
 

warum nicht in beiden Fällen?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy

CloseTicketCl = OrderTicket () im Allgemeinen können Sie dies tun...

und das, vor allem wenn man das Lot durch 3 teilt ?? der Auftrag wird mit demselben Lot geschlossen, mit dem er eröffnet wurde...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

nicht dass

elbe.

Ein Drittel des Lots wird geschlossen (gemäß einer der Bedingungen - nehmen wir an, der Preis hat +150 Pips erreicht). Das zweite Drittel wird geschlossen, sagen wir, wenn +300 Pips von der Eröffnung, usw...

und ehrlich gesagt verstehe ich diese

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
hier

nicht

Lots und OrderLots() ja, das gleiche.
 
hope >> Nicht dasselbe. Ein Drittel des Lots wird geschlossen (je nach einer der Bedingungen - nehmen wir an, der Kurs hat +150 Punkte erreicht). Das zweite Drittel wird geschlossen, sagen wir, wenn +300 Pips von der Eröffnung, usw..

Nein, das funktioniert nicht. Ein Auftrag - ein Lot, wenn Sie einen Auftrag mit 3 Lots eröffnet haben, können Sie das Lot nicht in irgendeiner Weise aufteilen - erst 1, dann 1 und dann 1 - der Auftrag schließt das gesamte Lot, d.h. der Auftrag schließt mit dem gleichen Lot wie er eröffnet wurde, Sie können Aufträge nicht in Teilen schließen...