Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 801

 

Non capisco qual è il problema?

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


Dovrebbe apparire un messaggio di chiusura. L'ordine si apre, arriva allo stop, si chiude e basta! Dov'è l'errore?
 

Sto risolvendo il compito di chiudere tutti i grafici aperti usando gli strumenti MQL4. Ci sono 3 grafici aperti con diverse coppie di valute e questo è il codice dello script:

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

Quando eseguo lo script, solo uno dei tre grafici viene chiuso ed ecco le stampe del log:

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

Significa che dopo la chiusura di un grafico il grafico corrente dovrebbe essere l'altro, ma:

1. Dopo che il primo grafico è chiuso, la funzioneChartIDrestituisce l'identificatore del grafico chiuso invece di quello corrente

2. Lafunzione ChartClose() in 2 e 3 iterazioni restituisce true, il che significa che chiude con successo la finestra già chiusa...

Chi sa dov'è il bug e come risolvere questo problema?

 
CJIeCaPb:

Non capisco qual è il problema?

Dovrebbe apparire un messaggio di chiusura. L'ordine si apre, arriva allo stop, si chiude e basta! Dov'è l'errore?

Penso che OrderSelect() debba essere all'interno del ciclo while, e inoltre, il numero di posizione non sarà corretto, perché dopo la sua chiusura diventerà diverso - in questo caso è meglio selezionare per ticket
 
tuner:
Penso che OrderSelect() dovrebbe essere dentro un ciclo while, e inoltre, il numero di posizione non sarà corretto, perché dopo la chiusura diventerà diverso - in questo caso è meglio selezionare dal ticket
Urrà, ha funzionato, grazie!
 
tuner:

Sto risolvendo il compito di chiudere tutti i grafici aperti usando gli strumenti MQL4. Ci sono 3 grafici aperti con diverse coppie di valute e questo è il codice dello script:

Quando eseguo lo script, solo uno dei tre grafici viene chiuso ed ecco le stampe del log:

Significa che dopo la chiusura di un grafico il grafico corrente dovrebbe essere l'altro, ma:

1. Dopo che il primo grafico è chiuso, la funzioneChartIDrestituisce l'identificatore del grafico chiuso invece di quello corrente

2. Lafunzione ChartClose() in 2 e 3 iterazioni restituisce true, il che significa che chiude con successo la finestra già chiusa...

Chi sa dov'è il bug e come risolvere questo problema?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako, a volte funziona, a volte no, non so perché... genera un errore:

2014.12.11 17:52:12.456 Violazione di accesso letto a 0x09295000 in 'C:\.....................ex4'

Potrebbe essere perché sta cercando di chiudere il grafico su cui viene lanciato lo script?

PS funziona correttamente se lo script è collegato al primo grafico da sinistra. Ma se lo metto su qualsiasi altro grafico, ottengo un errore

 
tuner:

pako, a volte funziona, a volte no, non so perché... genera un errore:

2014.12.11 17:52:12.456 Violazione di accesso letto a 0x09295000 in 'C:\.....................ex4'

Potrebbe essere perché sta cercando di chiudere il grafico su cui viene lanciato lo script?

PS funziona correttamente se lo script è collegato al primo grafico da sinistra. Ma se lo metto su qualsiasi altro grafico, ottengo un errore

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

Ragazzi, aiutatemi qui

Il problema è la seguente funzione per tradurre l'ordine in non-loss, non funziona correttamente quando la imposto sulle coppie Yen e permetto tutti gli ordini aperti in non-loss

Li lascio tutti ok, ma su cinque cifre torna a zero anche se lo imposto solo su cinque cifre ma la cosa migliore è che se lo imposto su cinque funziona bene

Qual è la ragione di questo lavoro? Cosa si deve tenere in conto in queste funzioni, in modo che l'esecuzione corretta sia corretta e non dipenda dal lavoro dell'esperto in quale finestra l'ho buttato tre o cinque cifre?

Grazie mille.

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

Grazie per il codice, ho capito il succo, anche se a volte ottengo ancora un errore.

Sperimentato con funzioni che mostrano gli ID dei grafici. Cosa sia ChartFirst() dalla documentazione non è assolutamente chiaro, si può interpretare in qualsiasi modo - può significare il primo grafico aperto in ordine da sinistra, o il primo grafico aperto tra tutti quelli aperti (nel tempo), o il primo mai aperto nel terminale (la possibilità che sia aperto ora è quasi zero, quindi non ha senso chiuderlo). Sono più propenso a quest'ultima versione, perché non ho mai visto questa funzione restituire l'ID del grafico, che è aperto al momento.

 
tuner:

Grazie per il codice, ho capito il succo, anche se a volte ottengo ancora un errore.

Sperimentato con funzioni che mostrano gli ID dei grafici. Cosa sia ChartFirst() dalla documentazione non è assolutamente chiaro, si può interpretare in qualsiasi modo - può significare il primo grafico aperto in ordine da sinistra, o il primo grafico aperto tra tutti quelli aperti (nel tempo), o il primo mai aperto nel terminale (la possibilità che sia aperto ora è quasi zero, quindi non ha senso chiuderlo). Sono più propenso a quest'ultima versione, perché non ho mai visto questa funzione restituire l'ID del grafico che è aperto al momento.

ChartFirst

Restituisce l'ID del grafico del primo grafico del terminale client.

Ho capito che questo è il grafico più a sinistra

Motivazione: