Errori, bug, domande - pagina 803

 
Karlson:
Diversi server, diversi 500 pp.
Cosa ha a che fare questo con i diversi server? Questi sono due test della stessa persona. Solo la coppia di valute specificata nel tester differisce
 
ilunga:
Cosa ha a che fare questo con i diversi server? Questi sono due test della stessa persona. Solo la coppia di valute specificata nel tester differisce
Aggiornate il vostro terminale/tester e forse tutto funzionerà, io ho la build 687 e tutto funziona.
 
fyords:

Ho tutto corretto, server MK demo.

Allora, per favore, spiegami qual è il valore tra parentesi quando apri un ordine e perché in un caso è (1,29565 / 1,29654) e nell'altro (1,29443 / 1,29479 / 1,29443)

(Intendo i risultati dei vostri test.

fyords:
Aggiornate il vostro terminale/tester e forse tutto funzionerà, io ho una build 687 e tutto funziona.

Esattamente lo stesso errore "salta fuori" quando si invia l'EA al campionato (nei loro test automatici), quindi l'aggiornamento aiuterà solo parzialmente


E c'è di più. Si presenta solo 1 volta (il primissimo tentativo di piazzare un ordine su una coppia di valute diversa dalla "vostra")

 
ilunga:
Cosa ha a che fare questo con i diversi server? Questi sono due test della stessa persona. Solo la coppia di valute specificata nel tester differisce.

Date un'occhiata agli articoli sul tester:

Non è necessario che i prezzi siano gli stessi quando si testa su un'altra coppia di valute

 
Rosh:

Date un'occhiata agli articoli sul tester:

I prezzi non devono corrispondere quando vengono testati su un'altra coppia di valute

Quindi, ho fatto qualche altro test. Davvero un problema con il "prezzo attuale".

Codice:

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

int OnInit()
{
   SymbolSelect("EURUSD", true);
   SymbolSelect("GBPUSD", true);
   m_sym.Name("EURUSD");
   a = false;
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

Nota, apro al prezzo del simbolo Ask più 1 (con un margine enorme). Allo stesso tempo prima e dopo stampo l'attuale Ask e Bid.


Risultati (quando si testa su GBPUSD):

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

Il prezzo 1,29241 viene stampato prima e dopo l'ordine. Nel frattempo, tra parentesi (quando l'ordine viene piazzato), il prezzo è 1,29722. COME? O sto ottenendo il prezzo attuale in modo errato?


E in secondo luogo, se c'è stato un errore con il prezzo, allora perché l'errore 10016 (stop)?

 
ilunga:

Ma l'errore esiste ancora nella cutscene.

Ad essere onesti, non capisco bene come l'errore 10016 possa essere in caso di assenza di fermate

Non so cosa e come lo stai facendo, il problema è probabilmente davvero in SL.

La mia versione funziona senza problemi. La chiamata, tuttavia, ha gettato nel blocco di inizializzazione, per non preoccuparsi di controlli (anche se la presenza dell'ordine prima di impostarlo sarebbe da controllare).

bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,2,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);
  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
File:
 
Interesting:

Non so cosa stai facendo lì, ma il problema è probabilmente davvero con SL.

La mia versione funziona senza problemi. La chiamata è davvero trasferita al blocco di inizializzazione, per non preoccuparsi dei controlli (anche se la presenza dell'ordine prima di impostarlo sarebbe da verificare).

Una piccola richiesta. Puoi correggere il codice, in modo che emetta il prezzo corrente del simbolo prima di OrderSend?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
Una piccola richiesta. Puoi modificare il codice in modo che prima di OrderSend emetta il prezzo corrente dello strumento su cui apriamo?

Provate in questo modo:

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
Piccola richiesta. Puoi correggere il codice, che emetterebbe il prezzo corrente su quello strumento prima di OrderSend?

Un prezzo spritzer? Non ne vedo la necessità, si può aggiungere un messaggio sul successo/fallimento del controllo e l'impostazione dell'ordine.

In linea di principio si può fare da soli, non dovrebbe essere difficile (per idea).

Rosh:

Provate in questo modo:

Per il debugging andrà abbastanza bene, nel codice di lavoro sarà superfluo (almeno una soluzione un po' stravagante)

Ed è meglio mettere l'ordine dopo OrderCheck, in modo che in caso di errore non vada a OrderSend.

PS

Ho dimenticato di aggiungere, in base all'esempio bar_info potrebbe essere messo in una funzione senza problemi.

 
Interesting:

Un prezzo spritzer? Non ne vedo la necessità, si può aggiungere un messaggio sul successo/fallimento del controllo e l'impostazione dell'ordine.

In linea di principio, si può fare da soli, non dovrebbe essere difficile (nell'idea).

Può essere abbastanza buono per il debug, ma nel codice di produzione sarà superfluo (almeno è una soluzione un po' storta).

E sarebbe meglio mettere l'ordine dopo OrderCheck, in modo che in caso di errore non si arrivi a OrderSend.

PS

Ho dimenticato di aggiungere, in base all'esempio bar_info potrebbe anche essere messo in una funzione senza problemi.

È divertente. Nel tuo esempio, ho rimosso BUYSTOP per GBP, rimane solo EURUSD.

Dopo aver riempito i campi nella richiesta, ho emesso il prezzo dell'ordine in sospeso.

1) Avete una variante - l'ordine pendente è inserito nell'Inite

2012.01.01 00:00:00 prezzo = 1.30487000

2) Ho commentato l'init, l'ho spostato in OnTick. Ho messo una condizione per scattare solo al primo tick.

2012.01.02 09:00:00 prezzo = 1.29720000


P.S. Ho capito bene che nel mio (e nel tuo) codice bar_info[1] è il massimo della barra attuale?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Motivazione: