[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 207

 
solnce600:

Signori, per favore ditemi come codificare (probabilmente in una dichiarazione condizionale) una semplice idea

-se un'operazione è stata chiusa con uno stop loss

-aprire un altro trade al prezzo di stop loss

Grazie

Dateun'occhiata in giro.
 
Roger:

1. Non si possono aprire ordini nella funzione init() (nello Strategy Tester questo funzionerà ancora, ma non nella demo).

2. Quando si chiudono gli ordini, si dovrebbe contare dalla fine all'inizio, e non viceversa, come nel tuo caso.

Grazie per la vostra risposta.
In questo caso l'operatore di loop è stato studiato nel tester, ecco perché gli ordini sono aperti in init() per semplificazione, questo non accade negli EA reali.
Cambiando l'ordine di selezione degli ordini, questi vengono effettivamente chiusi entro un tick (do il codice del programma e il report del log del tester qui sotto).
Sembra strano che MQL4 non mi permetta di cambiare l'ordine di lavoro con gli ordini. Se sapete perché, vi prego di avvisare, dato che secondo la logica di lavoro di un EA ho intenzione di chiudere gli ordini esattamente nell'ordine in cui sono stati aperti.

Sinceramente. Shurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 
Grazie mille per le preziose informazioni, cercherò sicuramente di prendere in considerazione tutto quello che mi hai detto in futuro.
 
borilunad:

Non puoi aprire esattamente al prezzo di stop loss, ma puoi condizionare l'apertura nella stessa direzione o in quella opposta!

Ecco una chiamata di funzione da "Funzioni utili" di Kim, che potete mettere in una condizione:

isCloseLastPosByStop - Restituisce la bandiera per chiudere l'ultima posizione per stop

if(isCloseLastPosByStop() == 0) o ... == 1) e quello che volete ......

Potete trovare la funzione qui: https://www.mql5.com/ru/forum/131859

E mettetelo fuori dall'inizio!

E vi esorto, potete fare tutto da soli, con diligenza, precisione e pazienza, altrimenti non imparerete nulla dai suggerimenti!

La conoscenza si acquisisce solo con uno sforzo adeguato da parte vostra! Mettiti al lavoro quotidiano di investigazione! Buona fortuna!


Grazie mille per le preziose informazioni, cercherò sicuramente di incorporare tutto quello che mi hai detto in futuro.
 

Buona giornata.

Per favore, ditemi se ci sono situazioni in cui i TC possono cambiare o cancellare i commenti a un ordine?

Grazie mille.

 
Gek34:

Per favore, ditemi se ci sono situazioni in cui i TC possono cambiare o cancellare i commenti a un ordine...?

Come esempio.
Commento nativo
e121220_3in1 01

Con aggiunta di DC dopo il rollover

e121220_3in1 01[swap]

Cioè, se cerchiamo un ordine con un commento, dobbiamo prima determinare la lunghezza della linea di commento nativa e poi controllare solo la prima parte del commento modificato nella lunghezza corrispondente. Oppure controlla se la stringa nativa è nel commento da controllare.

 

Shurkin:

Grazie per la risposta.
In questo caso il lavoro dell'operatore di loop è stato studiato esattamente nel tester, ecco perché gli ordini sono aperti in init() per semplificazione, questo non accade negli EA reali.
Cambiare l'ordine degli ordini porta effettivamente alla loro chiusura entro un tick (il codice del programma e il report del log del tester sono riportati di seguito).
Sembra strano che MQL4 non mi permetta di selezionare un ordine. Se ne conoscete il motivo, vi prego di avvisare, poiché la logica di lavoro dell'Expert Advisor suggerisce che gli ordini dovrebbero essere chiusi esattamente nell'ordine in cui sono stati aperti.

Sinceramente. Shurkin.



La logica è corretta - i numeri d'ordine degli ordini dovrebbero essere uguali ai numeri d'ordine. Una volta che un ordine viene chiuso, tutti gli altri saranno ricalcolati. Prova questa costruzione

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Buona giornata.

Per favore, ditemi se ci sono situazioni in cui i TC possono cambiare o cancellare i commenti a un ordine?

Grazie mille.


Abbiamo sperimentato un cambio completo di commento su un ordine. Inoltre, la magia è talvolta azzerata durante le chiusure parziali (le chiusure parziali sono avviate dal server). Ora, c'è un consigliere separato, in loop per controllare quest'ultimo, che monitora gli ordini "alieni" e altre incongruenze, notificando tramite messaggi Push in modo tempestivo.
 

Si prega di consigliare come scrivere correttamente la condizione:

1.se l'ordine symbol = simbolo e l'ordine magik = 135

2.se non ci sono ordini pendenti BAYSTOP

3.se non ci sono ordini aperti BAY O (se ci sono) stoploss> prezzo aperto

4.se il prezzo è tra MA e c'è un frattale in alto

INSERIRE ORDINE BUYTOP IN SOSPESO

SCRITTO COSÌ:

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==135) 

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

NON FUNZIONA! DITEMI QUAL È L'ERRORE!

 

Per favore, consigliatemi cosa potrebbe causare il seguente problema.

C'è un indicatore che utilizza funzioni esterne. Il codice della libreria compilata si trova nella cartella librerie, descrittori - in include.

Connessione #include <lib_Zemckikh.mqh>. Durante la prima esecuzione dell'indicatore, tutte le funzioni della libreria funzionano normalmente, l'indicatore viene visualizzato sul grafico. Dopo un cambio di parametri (dopo un nuovo calcolo dell'indicatore) le funzioni di biblioteca non vengono chiamate, l'indicatore non viene visualizzato, non ci sono voci nella scheda "Esperti" dopo il cambio di parametri.

Se si esclude la connessione della libreria e si mettono le funzioni necessarie nel file indicatore (compilato direttamente con le funzioni), tutto funziona bene.

Non riesco a capire cosa c'è che non va. Non voglio inquinare il forum, non allego i codici. Se ne hai bisogno, te lo mando di persona.