Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1243

 

Non ho la minima voglia di andare su Google o leggere, quindi ho aperto il file D:\1.txt

/*
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
HINSTANCE ShellExecuteW(
  HWND    hwnd,
  LPCWSTR lpOperation,
  LPCWSTR lpFile,
  LPCWSTR lpParameters,
  LPCWSTR lpDirectory,
  INT     nShowCmd
);
*/
#import "shell32.dll"
int ShellExecuteW(int hWnd, string lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
#import
#define  SW_SHOW 5
#define  SW_SHOWNORMAL 1
//+------------------------------------------------------------------+
void OnStart()
{
   ShellExecuteW(NULL,"Open","notepad.exe","D:\\1.txt",NULL,SW_SHOW); 
}
//+------------------------------------------------------------------+
 

Qual è il modo migliore per farlo nell'indicatore, per avviare il timer 1s o in OnCalculate per confrontare il tempo (secondi)

<1sec, uscire

o ci sono altre opzioni di lavoro?

necessità di aggiornare HistorySelect per il mese + lavoro con gli oggetti

 
Fast235:

o in OnCalculate confrontare il tempo (secondi)

<1sec, uscita

Il problema è con il datetime: non può essere meno di un secondo.

confrontare almeno i millisecondi

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const LastOnCalculate = GetTickCount(); &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   static uint LastOnCalculate = GetTickCount();
   if(GetTickCount() - LastOnCalculate < 1000) return(rates_total);
   LastOnCalculate = GetTickCount();
   .........
   return(rates_total);
}
Fast235:

cosa è meglio fare nell'indicatore, per avviare un timer 1s o in OnCalculate per confrontare il tempo (secondi)


non è importante dove farlo, l'unica cosa che OnCalculate è legato ai tick - non ci sarà nessun tick e quindi non ci sarà nessuna chiamata OnCalculate

Fast235:

è necessario aggiornare HistorySelect per un mese + lavorare con gli oggetti

HistorySelect è veloce, ma quando si va a spostare o creare oggetti, ci possono essere dei ritardi, se gli oggetti superano i 1000 +

e voi modificherete questi oggetti ogni secondo


(inserisci il tuo codice e le insidie appariranno ))))

 

un secondo è sufficiente per me e meno spesso finché non arriva il tick

per me visualizzare le operazioni sul grafico + il risultato dell'operazione su barre, e alcune informazioni semi-statiche come la tendenza globale

può prezzo guardare il cambiamento da

int OnCalculate (const int rates_total,      // размер массива price[] 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const int begin,            // откуда начинаются значимые данные 
                 const double& price[]       // массив для расчета 
   );

o il tempo della seconda opzione

 

Per favore, ditemelo!

Come posso confrontare il simbolo del grafico attuale con quello che mi serve?

      case 1 : // кейс для открытия Buy по AUD/USD
               if(Symbol() == (как обозначить нужный символ для сравнения?))                                    // если символ текущего графика AUD/USD открываем сделку
               {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_BUY,Lot(),Ask,0,0,0); // Открытие ордера
//----------------------------------------------------------------------------------------------------
В тоже время советник запущен на другом графике и пытается произвести открытие ордера, цены не совпадают и соответственно вылетает ошибка - неверные цены

      case 2 : // кейс для открытия Bay по GBP/USD 
               if(Symbol() == (как обозначить нужный символ для сравнения?)) 
// если символ текущего графика не AUDUSD то выходим
               {
                  RefreshRates();
                  Open_Order = OrderSend("GBPUSD",OP_SELL,Lot(),Bid,0,0,0); // Открытие ордера

Т.е. надо ему дать понять, что тот или иной кейс принадлежит тому или другому графику, но чтот я пока не придумал как

Ho bisogno che il programma apra un ordine su AUD/USD, quindi apre l'ordine (funziona correttamente). Tuttavia, il programma cerca di aprire l'ordine su altri grafici aperti(il robot è in esecuzione su diverse coppie di valute) e restituisce un errore di prezzo per le altre coppie di valute dove l'Expert Advisor è in esecuzione. Devo fare un confronto e se Symbol() == è uguale al simbolo su cui l'ordine dovrebbe essere aperto, allora lo apriamo e se no, usciamo. Non ho trovato da nessuna parte come impostare il nome del simbolo dal terminale e fare il confronto.

 
Denis Diakonov:

Per favore, ditemelo!

Come posso confrontare il simbolo del grafico attuale con quello che mi serve?

Ho bisogno che il programma apra un ordine su AUD/USD, quindi apre l'ordine (funziona correttamente). Tuttavia, il programma cerca di aprire l'ordine su altri grafici aperti(il robot è in esecuzione su diverse coppie di valute) e restituisce un errore di prezzo per le altre coppie di valute dove l'Expert Advisor è in esecuzione. Devo fare un confronto e se Symbol() == è uguale al simbolo su cui l'ordine dovrebbe essere aperto, allora lo apriamo e se no, usciamo. Non ho trovato da nessuna parte come impostare il nome del simbolo dal terminale e fare il confronto.

C'è un esempio di come ottenere i prezzi giusti alla fine.

SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Denis Diakonov:

Grazie, ma non ho bisogno dei prezzi giusti. I prezzi vanno bene. Ho bisogno che l'EA non apra un ordine se la coppia di valute alla quale l'ordine viene aperto non è la stessa del grafico aperto corrente al quale il robot è collegato. Forse possiamo implementare questo aprendo un nuovo grafico con un timeframe, aprire un ordine desiderato in esso e poi chiudere il grafico.

string  symbol;
....
int OnInit()
{...
 symbol=Symbol();
....
}
void OnTick()
...
 if(symbol == Symbol())
{
...//открываем ордер
}
....
 
Valeriy Yastremskiy:
Valeriy Yastremskiy:

No, non funziona così.

Il mio programma accede al grafico corrente, gli assegna il nome dello strumento corrente e lo sigilla in una variabile, poi confronta il valore di questa variabile con il simbolo corrente sul grafico. In realtà lo confronta con se stesso)))) Ho bisogno di convertire in qualche modo Sympol() in qualsiasi valore con cui qualsiasi altra variabile può essere confrontata. Per esempio:

AUDUSD;

(Simbolo() == AUDUSD)

In qualche modo sono riuscito a farlo - mentre mi rallegravo e cambiavo tutto correttamente - non funziona più niente))

 
Denis Diakonov:

No, non funziona così.

Il mio programma accede al grafico corrente, gli assegna il nome dello strumento corrente e lo sigilla in una variabile, poi confronta il valore di questa variabile con il simbolo corrente sul grafico. In realtà lo confronta con se stesso)))) Ho bisogno di convertire in qualche modo Sympol() in qualsiasi valore con cui qualsiasi altra variabile può essere confrontata. Per esempio:

AUDUSD;

(Simbolo() == AUDUSD)

In qualche modo sono riuscito a farlo - mentre mi divertivo e cambiavo tutto correttamente - non funziona niente))

stringa AUDUSD = "AUDUSD";

Almeno così.

 
Denis Diakonov:

No, non funziona così.

Il mio programma accede al grafico corrente, gli assegna il nome dello strumento corrente e lo sigilla in una variabile, poi confronta il valore di questa variabile con il simbolo corrente sul grafico. In realtà lo confronta con se stesso)))) Ho bisogno di convertire in qualche modo Sympol() in qualsiasi valore con cui qualsiasi altra variabile può essere confrontata. Per esempio:

AUDUSD;

(Simbolo() == AUDUSD)

L'ho fatto in qualche modo, e mentre mi rallegravo e cambiavo tutto, non funzionava più niente))

L'Expert Advisor, lo script, l'indicatore non si applicano, ma lavorano nella finestra corrente. E le variabili globali di diverse finestre / grafici non si sovrappongono. Pertanto, dovrebbe funzionare)

string AUDUSD; // Questa è una variabile di testo, che inizialmente è vuota, cioè uguale a ""

(Symbol() == AUDUSD) // questa stringa non ha niente a che fare con la variabile AUDUSD.

Symbol
Возвращает имя символа текущего графика.
string  Symbol();
Возвращаемое значение
Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.

Ma i criteri di apertura degli ordini non dovrebbero essere gli stessi per diversi strumenti/finestre. Se sono uguali, si apriranno effettivamente in tutte le finestre.

Motivazione: