Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 31

 
In alternativa, consigliate come scrivere questa funzione di cancellazione in questa condizione.
 
spoiltboy:
In alternativa, ditemi come scrivere questa funzione di cancellazione in questa condizione.

dovete prima definire il biglietto dell'ordine pendente da cancellare

se il biglietto è nullo o indefinito - allora non cancellarlo

 
spoiltboy:

Questo è per ordini diversi. La funzione di rimuovere uno da una condizione, rimuovendo l'altro senza una condizione.

La domanda è perché nel mio caso la funzione di cancellazione funziona con successo senza una condizione, ma se la metto in una condizione, genera un errore quando la condizione si verifica.

La condizione deve essere corretta, non è possibile farlo senza la condizione, i registri occuperanno tutto il disco rigido
 
Renat Akhtyamov:

dovete prima definire il ticketD e il ticketUP da cancellare

Se il biglietto è nullo o indefinito, allora nessuna cancellazione

Così definito, un ticketD, l'altroticketUP .

O sto mischiando qualcosa?

 
spoiltboy:

Così definito, un ticketD, l'altroticketUP .

O sto confondendo qualcosa?

Come può essere definito seticketUP è già cancellato?

L'hai cancellato, aggiorna ticketUP allo stato che ti serve, in cui la condizione per cancellare il ticketUP non funzionerà, e anche questa condizione deve essere aggiunta al codice

 
Renat Akhtyamov:

Come può essere definito seil ticketUP è già stato cancellato?

L'avete cancellato, aggiornate ticketUP allo stato che vi serve, in cui la condizione per cancellare il biglietto non funzionerà, e anche questa condizione deve essere aggiunta al codice.

Così, gli ordini conticketD, un altroticketUP sono creati prima (secondo la condizione di assenza), e dopo sono già cancellati.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
if(ticketUP==-1)Print("ERROR OP_BUY"); elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
if(ticketD==-1)Print("ERROR OP_SELL"); elsePrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

Se sono confuso, cosa?

 
spoiltboy:

Così gli ordini conticketD, un altroticketUP sono creati prima (secondo la condizione di assenza), e poi sono cancellati.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointsl*Point,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
se(ticketUP==-1)Print("ERROR OP_BUY"); altrimentiPrint("OP_BUY OK");}

se(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1+pointsl*Point,5);
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
se(ticketD==-1)Print("ERROR OP_SELL"); altrimentiPrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

Se confondo cosa?

Ancora una volta avete un comando senza una condizione:

OrderDelete(ticketUP);

Perché non hai cambiato il codice?

Prenditi un po' di tempo per "pensare" almeno e sistemare la cosa + leggi quello che hai scritto, i consigli che ti sono stati dati.

A proposito, qui c'è il freelance se non puoi...

 
Renat Akhtyamov:

Quindi di nuovo avete un comando senza una condizione:

OrderDelete(ticketUP);

Perché non avete cambiato il codice?

Prenditi un po' di tempo per "pensare" almeno e capirlo + leggi cosa ti hanno scritto, quali consigli ti hanno dato.

A proposito, qui c'è il freelance se non funziona...

Senza una condizione - perché è così che avviene la rimozione, e con una condizione - no. Così ha scritto per indicare che non posso. Dovresti scriverlo in questo modo:

OrderDelete(ticketD);

OrderDelete(ticketUP);

Poi ogni tick cancella gli ordini già creati su ogni tick (secondo la condizione di assenza). E se lo scriviamo con la condizione

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Poi, quando la condizione si verifica, scrive un errore di cancellazione.

Come posso scrivere la cancellazione degli ordini specificati in questa condizione?

 
spoiltboy:

È senza condizione - perché è così che funziona la cancellazione, ma con una condizione no. L'ho scritto in questo modo per indicare ciò che non posso fare. Se lo scrivi in questo modo

OrderDelete(ticketD);

OrderDelete(ticketUP);

Poi ogni tick cancella gli ordini già creati su ogni tick (secondo la condizione di assenza). E se lo scriviamo con la condizione

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Poi, quando la condizione si verifica, scrive un errore di cancellazione.

Come dovremmo scrivere la condizione sulla cancellazione degli ordini specificati?


Non puoi rimuovere la condizione per cancellare gli ordini!

ticketUP e ticketD dovrebbero essere scritti nelle variabili globali quando si apre un biglietto

GlobalVariableSet("ticketUP",ticketUP);

GlobalVariableSet("ticketD",ticketD);

e leggere da lì prima di cancellare un biglietto in sospeso

ticketUP=GlobalVariableGet("ticketUP")

ticketD=GlobalVariableGet("ticketD")

A proposito, guarda lì (in globale) - quello che hai, che biglietto è scritto

Penso che dopo questo tutto funzionerà come dovrebbe

 
Ciao, chi può aiutare a risolvere il problema, sto scrivendo un viper per un array dinamico, ecco il codice della classe:
class CArray
{  
private:
   template <typename T>
   T _array[];
   int _index;
   int _err;
   int _err_sys;
public:
   CArray(){_index = -1; _err = 0; _err_sys = 0;}
   ~CArray(){}
  // template <typename T>
   T operator[](int i){
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   T at(int i){  
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   void push_back(T value){
      _array[++_index] = value;
   }
};

parte del codice del programma:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.1"
#property strict

#include "Array.mqh"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CArray *array;


int OnInit()
  {
  int b = 1;
   array = new CArray();
   array.push_back(b);
   int a = array.at(0);
  
//---
   return(INIT_SUCCEEDED);
  }
...

Dopo aver provato ad eseguire l'Expert Advisor su dati reali, viene lanciato il seguente errore: internal error #-1005

Cosa faccio di sbagliato? Grazie in anticipo!


Motivazione: