Quale disegno è corretto? - pagina 5

 
valenok2003:

Il risultato è questo script

Domanda - Perché non chiude sempre tutti gli ordini? Per esempio, apro tre ordini Sell uno dopo l'altro e cerco di chiuderli, ma lo script può chiuderne uno, due o tutti. Qual è la ragione?

Avete bisogno di uno script?

Allora non hai bisogno di un'istruzione while, gli script funzionano in loop così com'è.

Per lo script hai bisogno di questa costruzione...

Non ricordo il link, ecco lo script che chiude tutti gli ordini aperti.

//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           Jedimedic77@gmail.com  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && 
      !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 
valenok2003:

Il risultato è questo script

Domanda - Perché non chiude sempre tutti gli ordini? Per esempio, se apro tre ordini di vendita in fila, poi provo a chiuderli con lo script, potrebbe chiuderne uno, due o tutti. Qual è la ragione?
E le virgolette di quante cifre sono?
 
khorosh:
E le virgolette di quante cifre sono?
cinque
 
Martingeil:

Avete bisogno di uno script?

Grazie, naturalmente. Ma è facile ottenere una sceneggiatura pronta all'uso. Voglio scoprire qual è la ragione.
 
Martingeil:

Avete bisogno di uno script?

allora non c'è bisogno dell'istruzione while, gli script funzionano in loop così com'è.


Lo script funziona solo una volta. Non c'è nessun auto-ciclo e non c'è mai stato.

Valenok, hai bisogno che lo script chiuda tutti gli ordini o solo questo simbolo?

 
Martingeil:

Avete bisogno di uno script?

Allora non c'è bisogno dell'istruzione while, gli script funzionano in loop così com'è.

Per uno script avete bisogno di questa costruzione...

Non ricordo il link, ecco uno script che chiude tutti gli ordini aperti.

Nel codice while , solo per ritardare mentre il thread è occupato.
 
Techno:

lo script funziona solo una volta. Non c'è nessun auto-innesco e non c'è mai stato.

Valenok, vuoi che lo script chiuda tutti gli ordini o solo questo simbolo?

Sì, hai ragione, ho sbagliato, volevo dire che non dipende dalle zecche...
 
Techno:

lo script funziona solo una volta. Non c'è nessun auto-innesco e non c'è mai stato.

Valenok, hai bisogno dello script per chiudere tutti gli ordini o solo questo simbolo?



Solo ordini aperti di un solo simbolo. Quelli in sospeso non sono interessati.

La cosa divertente è che il codice criticato in kodobase

int start()
{
//----
  while(OrdersTotal()>0)
  {
    for (int i=0; i < OrdersTotal(); i++)                                                        
    {                                                                                          
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);  
      }
    }
  }                                               
//----
   return(0);
}

funziona senza problemi, ma quando ho iniziato a migliorarlo, ho iniziato ad avere problemi.

zy:

A proposito della stringa errata

for (int i=0; i < OrdersTotal(); i++)

L'ho già capito.

 
valenok2003:



Solo ordini aperti di un solo simbolo. Non tocchiamo quelli in sospeso.

Quindi, passiamo direttamente ai rinvii e lo facciamo. In forma generale.

int start()
{
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol())
      switch(OrderType())
         {
         case 0  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
         case 1  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
         default : OrderDelete(OrderTicket()); break;
         }
    }
        
}
 
Martingeil:
Hai ragione, non intendevo in quel senso, a prescindere dai tic...


Ne sono consapevole.