Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1243

 

Je n'ai pas la moindre envie de chercher sur Google ou de lire, alors j'ai ouvert le fichier 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); 
}
//+------------------------------------------------------------------+
 

Quelle est la meilleure façon de le faire dans l'indicateur, pour démarrer la minuterie 1s ou dans OnCalculate pour comparer le temps (secondes).

<1sec, sortie

ou il existe d'autres options de travail ?

nécessité de mettre à jour HistorySelect pour le mois + travailler avec des objets

 
Fast235:

ou dans le temps de comparaison OnCalculate (secondes)

<1sec, sortie

La seconde n'est pas suffisante. Le problème vient de la date : elle ne peut pas être inférieure à une seconde.

comparer au moins des millisecondes

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:

Qu'est-ce qui est le mieux à faire dans l'indicateur, démarrer une minuterie de 1s ou dans OnCalculate pour comparer le temps (secondes) ?


il n'est pas important de savoir où le faire, la seule chose que OnCalculate est liée aux ticks - il n'y aura pas de tick et donc il n'y aura pas d'appel OnCalculate

Fast235:

vous devez mettre à jour HistorySelect depuis un mois + travailler avec des objets

HistorySelect est rapide, mais lorsque vous allez déplacer ou créer des objets, il peut y avoir des décalages, si les objets sont supérieurs à 1000 +.

et vous allez modifier ces objets toutes les secondes.


(entrez votre code et les pièges s'afficheront )))).

 

une seconde suffit pour moi et moins souvent jusqu'à ce que le tic-tac arrive

pour moi, afficher les transactions sur le graphique + le résultat de la transaction sur les barres, et quelques informations semi-statiques comme la tendance globale.

peut regarder le prix du changement de

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

ou le temps de la deuxième option

 

S'il te plaît, dis-moi !

Comment puis-je comparer le symbole graphique actuel avec celui dont j'ai besoin ?

      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); // Открытие ордера

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

J'ai besoin que le programme ouvre un ordre sur AUD/USD, il ouvre donc l'ordre (il fonctionne correctement). Cependant, le programme essaie d'ouvrir l'ordre sur d'autres graphiques ouverts(le robot fonctionne sur plusieurs paires de devises) et il renvoie une erreur de prix pour les autres paires de devises où le conseiller expert fonctionne. Je dois faire une comparaison et si Symbol() == est égal au symbole sur lequel l'ordre doit être ouvert, alors nous l'ouvrons et si non, nous sortons. Je n'ai trouvé nulle part comment définir le nom du symbole à partir du terminal et effectuer la comparaison.

 
Denis Diakonov:

S'il te plaît, dis-moi !

Comment puis-je comparer le symbole graphique actuel avec celui dont j'ai besoin ?

J'ai besoin que le programme ouvre un ordre sur AUD/USD, il ouvre donc l'ordre (il fonctionne correctement). Cependant, le programme essaie d'ouvrir l'ordre sur d'autres graphiques ouverts(le robot fonctionne sur plusieurs paires de devises) et il renvoie une erreur de prix pour les autres paires de devises où le conseiller expert fonctionne. Je dois faire une comparaison et si Symbol() == est égal au symbole sur lequel l'ordre doit être ouvert, alors nous l'ouvrons et si non, nous sortons. Je n'ai trouvé nulle part comment définir le nom du symbole à partir du terminal et faire une comparaison.

Il y a un exemple d'obtention des bons prix à la fin.

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

Merci, mais je n'ai pas besoin des bons prix. Les prix sont corrects. J'ai besoin que l'EA n'ouvre pas un ordre si la paire de devises sur laquelle l'ordre est ouvert n'est pas la même que le graphique ouvert actuel auquel le robot est attaché. Nous pourrions peut-être mettre en œuvre cette solution en ouvrant un nouveau graphique avec un horizon temporel, en y ouvrant un ordre souhaité, puis en fermant le graphique.

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

Non, ça ne marche pas comme ça.

Mon programme accède au graphique actuel, lui attribue le nom de l'instrument actuel et le scelle dans une variable, puis compare la valeur de cette variable au symbole actuel sur le graphique. Il la compare en fait à elle-même)))) Je dois d'une manière ou d'une autre convertir Sympol() en une valeur à laquelle toute autre variable peut être comparée. Par exemple :

AUDUSD ;

(Symbol() == AUDUSD)

J'ai réussi à le faire - pendant que je me réjouissais et que je changeais tout correctement - rien ne fonctionne plus ;))

 
Denis Diakonov:

Non, ça ne marche pas comme ça.

Mon programme accède au graphique actuel, lui attribue le nom de l'instrument actuel et le scelle dans une variable, puis compare la valeur de cette variable au symbole actuel sur le graphique. Il la compare en fait à elle-même)))) Je dois d'une manière ou d'une autre convertir Sympol() en une valeur à laquelle toute autre variable peut être comparée. Par exemple :

AUDUSD ;

(Symbol() == AUDUSD)

J'y suis parvenu tant bien que mal, jusqu'à ce que je sois satisfait et que je modifie tout correctement - rien ne fonctionne ;))

string AUDUSD = "AUDUSD" ;

Au moins comme ça.

 
Denis Diakonov:

Non, ça ne marche pas comme ça.

Mon programme accède au graphique actuel, lui attribue le nom de l'instrument actuel et le scelle dans une variable, puis compare la valeur de cette variable au symbole actuel sur le graphique. Il la compare en fait à elle-même)))) Je dois d'une manière ou d'une autre convertir Sympol() en une valeur à laquelle toute autre variable peut être comparée. Par exemple :

AUDUSD ;

(Symbol() == AUDUSD)

Je l'ai fait d'une manière ou d'une autre, et pendant que je me réjouissais et que je changeais tout, rien ne fonctionnait plus ;))

Le conseiller expert, le script, l'indicateur ne s'appliquent pas, mais fonctionnent dans la fenêtre actuelle. Et les variables globales de différentes fenêtres / graphiques ne se chevauchent pas. Par conséquent, cela devrait fonctionner)

string AUDUSD ; // Il s'agit d'une variable texte, qui est initialement vide, c'est-à-dire égale à "".

(Symbol() == AUDUSD) // cette chaîne n'a rien à voir avec la variable AUDUSD.

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

Mais les critères d'ouverture des ordres ne doivent pas être les mêmes pour différents instruments/fenêtres. S'ils sont identiques, ils s'ouvriront effectivement dans toutes les fenêtres.

Raison: