[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 247

 
J'ai une idée pour faire fonctionner un seul et même EA avec différents assistants. Le problème est que lorsqu'il y a un blocage, le robot va gérer séparément cette situation sans interférer avec les autres ordres. Par exemple, nous avons une position ouverte à Bay (magic 001), le marché a été contre nous et au lieu de fermer la transaction, la transaction opposée s'ouvre à Sell avec magic 001 et le robot va liquider cette situation, mais pour éviter d'attendre longtemps pour liquider la situation, je veux ouvrir à nouveau Bay mais déjà avec magic (002) et si la tendance n'est pas réussie, le verrou avec magic (002) ouvrira à nouveau Sell avec (002), etc. Pouvez-vous dire comment faire fonctionner les transactions comme suit avec différentes paires magiques ?
 
pasha5282:
Si j'ai une idée pour faire fonctionner un même EA avec différents assistants, le robot devrait gérer séparément cette situation lorsqu'un blocage se produit et ne pas interférer avec les autres ordres. Par exemple, nous avons une position ouverte à la Baie (magie 001), le marché est allé contre nous et au lieu de fermer la transaction, la transaction opposée s'ouvre à la Vente avec la magie 001 et le robot s'occupera de la situation et je veux ouvrir à nouveau la Baie mais avec la magie (002) et si la tendance n'est pas corrigée, la Vente opposée avec la magie (002) s'ouvrira à nouveau et ainsi de suite. Un conseil pour faire fonctionner les transactions comme une couche avec des magies différentes ? ou comment l'implémenter ?
int MagicNumber=001;
//---
if (OrdersTotal()>0) // проверяем, есть ли ордера
{  for (int i=OrdersTotal()-1; i>=0; i--) // перебор ордеров
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // выбирается ордер среди открытых и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue; // проверяем - ордер по текущему символу?
         if (OrderMagicNumber()!=MagicNumber) continue; // проверяем - ордер с нужным магиком?
         //---
         if (OrderType()==OP_BUY) // если это открытая позиция на покупку, то ...
           {  // ... какие-то действия
                 return(0);
           }
         //---
         else
         if (OrderType()==OP_SELL) // если это открытая позиция на продажу, то ...
           {  // ... какие-то действия
                 return(0);
           }
}  }  }

Exemple d'un compteur d'ordres ouverts et en attente par le symbole et le magicien requis

string _Symbol="AUDUSD";
int MagicNumber=555;
//---
int Opened_pos=0;
if (OrdersTotal()>0)
{  for (i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()==_Symbol)
         {  if (OrderMagicNumber()==MagicNumber)
            Opened_pos++;
}  }  }  }
 

Pour une raison quelconque, le terminal s'est bloqué pendant le test. Maintenant, lorsque vous l'allumez, il commence à utiliser environ 150 mb de mémoire et se bloque. J'allais réinstaller, mais j'ai déplacé tous mes fichiers avant de le faire. Lorsque j'ai ouvert les dossiers, j'ai constaté que tous les fichiers que j'avais créés n'y étaient pas. Où sont les autres ?


 
silhouette:

Pour une raison quelconque, le terminal s'est bloqué pendant le test. Maintenant, lorsque vous l'allumez, il commence à utiliser environ 150 mb de mémoire et se bloque. J'allais réinstaller, mais j'ai déplacé tous mes fichiers avant de le faire. Lorsque j'ai ouvert les dossiers, j'ai constaté que tous les fichiers que j'avais créés n'y étaient pas. Où sont les autres ?

La capture d'écran de gauche est MQL5 et non 4.
 
gyfto:

sss2019, pas le temps de s'en occuper maintenant, désolé.


Dès que j'en aurai le temps, je le corrigerai et modifierai le code dans le message.

Question. Comment obtenir un pointeur sur une chaîne de caractères ? La chaîne MQL4 est C++ lpsz, d'après ce que j'ai compris. Mais comment puis-je obtenir l'adresse de la chaîne elle-même ?

Il n'y a aucun moyen de le faire dans MQL4. Vous pouvez passer la chaîne à la DLL et renvoyer l'adresse en tant que INT.
 
paladin80:
La capture d'écran de gauche est MQL5, pas 4.

Non, c'est le quatrième. C'est juste que lorsque vous cliquez sur le quatrième fichier, il s'ouvre sur le cinquième, pour une raison quelconque.
 
silhouette:
Non, le quatrième. C'est juste que les fichiers du quatrième, quand on clique dessus, s'ouvrent sur le cinquième, pour une raison quelconque.

Ouvrez MetaEditor pour 5, dans la fenêtre de gauche "Navigateur" -> sur un dossier, faites un clic droit -> "Ouvrir le dossier" et là, parmi les dossiers, essayez de chercher.



 
Zhunko:
Il n'y a aucun moyen de le faire dans MQL4. Vous pouvez passer une chaîne de caractères à une DLL et retourner l'adresse en tant que INT.

//C++
#include "stdafx.h"
#include <windows.h>
#define MT4_EXPFUNC __declspec(dllexport)
struct MqlStr {
   int               len;
   char             *string;
  };
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}
MT4_EXPFUNC int __stdcall GetStrAddress(const char *str) {    
    MqlStr* s = (MqlStr*)str;
    return (int)s->string; 
}

//MQL4

#import "StrAddress.dll"
int GetStrAddress(string str);//на входе имя инициализированной строки, на выходе её адрес
#import
//объявляем:
string s="something";
int address;
//пример использования:
int start(){
   address=GetStrAddress(s);
   Print(" адрес s равен " s);
}

Pour que d'autres ne souffrent pas de la même façon, j'ai joint le projet zippé complet. Avec des sources, pour que d'autres puissent voir qu'il ne s'agit pas d'un virus. Je n'ai pas eu le temps de vérifier ce qui est compilé par VC++ 6.0 et ce qui ne l'est pas. StrAddress.dll se trouve dans le dossier Debug.

Dossiers :
straddress.zip  984 kb
 
paladin80:

Ouvrir MetaEditor pour 5, dans la fenêtre de gauche "Navigateur" -> clic droit sur un dossier -> "Ouvrir le dossier" et là, parmi les dossiers, essayer de chercher.



Merci, mais rien de mt4 ne s'y trouve. J'ai utilisé la recherche et trouvé tous les fichiers à l'adresse suivante :

C:\Users\Qwer\AppData\Local\VirtualStore\Program Files\MetaTrader 4\experts\include

Je n'ai aucune idée de comment ils sont arrivés là, pour être honnête, car ils ont été sauvegardés correctement auparavant.

 

gyfto:
//C++

MT4_EXPFUNC int __stdcall GetStrAddress(const char *str) {    
    MqlStr* s = (MqlStr*)str;
    return (int)s->string; 
}
//MQL4

Pour que d'autres ne souffrent pas de la même façon, j'ai joint le projet zippé complet. Avec des sources, pour qu'ils puissent voir que ce n'est pas un virus. Je n'ai pas eu le temps de vérifier ce qui est compilé par VC++ 6.0 et ce qui ne l'est pas. StrAddress.dll se trouve dans le dossier Debug.

C'est comme ça :
MT4_EXPFUNC int stdcall GetStrAddress(LPCSTR szStr)
 {    
  return(int(szStr));
 }