[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 289

 
qwert2:
C'est ce qui se passe si le script est simplement déplacé dans le dossier des experts. Ça marche, mais pas comme ça devrait. Le script crée 8 ordres en attente, mais si vous le sauvegardez simplement dans le dossier des experts, il crée 8 ordres en attente après chaque tick. J'ai besoin qu'il passe 8 nouvelles commandes uniquement après la clôture des anciennes.
Cela n'a pas été mentionné dans votre question. La façon de transformer le script en un conseiller expert n'a pas d'importance. Il s'agit d'une autre mise en œuvre du programme.
 
Roger:

J'ai trouvé une erreur. Dans la bibliothèque de cette fonction, sur la ligne

doit supprimer le zéro dans chacun des numéros 13, 14 et 15.


Maintenant, correctement



Bonjour les fonctions de la bibliothèque.
 
Roger:

Нашел ошибку. В библиотеке для данной функции в строке
надо удалить по нулю в 13, 14 и 15 числе.

Теперь правильно
tara:
Fonctions de la bibliothèque Hello.
Non ! Vous ne pouvez pas toucher aux fonctions de la bibliothèque standard! Dima interdit :-))
 
artmedia70:

Avez-vous écrit seulement un "report" dans votre scénario ? Ensuite, il ne fera que tergiverser : autant de tics rentrés qu'il en faut... Oups... .........

Vous devez mettre un contrôleur d'interdiction là-dedans aussi...


))))) Impossible de résister)))))

Très bien, passons aux choses sérieuses. Je travaille sur l'optimisation du code de la deuxième TF, j'ai décidé de traduire double en int[2] pour écrire la structure RateInfo en un seul bloc. J'y ai réfléchi et j'ai décidé de décrire tous les moyens possibles, y comprisceux qui sont irréalisables, afin que quelqu'un puisse être prévenu contre les erreurs.

1. WinAPI (msdn). D'une manière générale, il n'y a pas grand-chose à faire en termes de fonctions de conversion. Cela est dû au fait que la conversion fait un usage intensif de la traduction de type c, qui est quelque chose comme

char s1;
char s2="g";//код ANSI 0x67
int i1=1357;//0x54D в шестн. представлении
int i2;

s1=(char)i1;//0x4D, "M", старший разряд (5) был усечён по границе байта (две шестн. цифры), остался один байт (0x4D, десятичное 77)
i2=(int)s2;//0x00 0x00 0x00 0x67, десятичное 103

dans l'avant-dernière ligne,int i1 est converti en char et dans la dernière ligne, char s2 est converti en int. Par conséquent, tous ces éléments sont utilisés dans des "fonctions de conversion" qui, en fait, ne se trouvent dans aucune dll WinAPI, mais sont déclarées dans les fichiers .h de l'en-tête à l'aide de macros telles que

#define _dtoi64(d)     (*((int64_t *)&(d)))
#define _dtoui64(d)     (*((uint64_t *)&(d)))

qu'au moment de la compilation le préprocesseur déroule en chaîne de caractères comme dans le premier code. Et les fichiers d'en-tête .h ne sont pas des dll et ne sont utilisés que dans l'environnement de développement (Studio, Borland, gcc, etc.). Par conséquent, ce n'est ni bon ni mauvais pour MQL4. Cependant, vous pouvez toujours vérifier si la fonction est déclarée uniquement dans le fichier .h de l'en-tête ou dans les fonctions exportées et cachées des yeux indiscrets d'une dll de System32.

2) WinAPI (dll CRT). Ces dlls sont nommées msvcp*, msvcr*, msvcrt*, msvci*, msvcirt. Ici le choix est plus large : _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoul. Les symboles du nom ont la signification suivante :

a, str, w - string
f, l, i, ui, ul - int (4 байта)
d, dbl, i64 - double, int[2] (8 байт)
ldbl - int[2.5] (шучу) - 10 байт.

Mais le _dtoi64/_dtoui64 attendu est toujours absent. En utilisant les définitions de msvcrt*, msvci*, msvcirt.dll, par contre

istream::operator>>(double &)
ostream::operator<<(double)

n'est disponible, même si vous êtes tordu, qu'en tant qu'opération de fichier (ce sont des opérations de console).

Vous pouvez effectuer des recherches, en dehors de msdn, surce site, voici la barre de recherche du site. Une chaîne de recherche msdn similaire "pratique" est ici. En quoi diffèrent-ils ? La msdn a une bonne description des fonctions, mais certaines n'y sont pas du tout (NativeAPI, par exemple). Dans l'alternative, en revanche, il existe un tableau d'exportation de dll système, mais pas de description. En fait, il est plus facile d'obtenir un ensemble de tableaux d'exportation sur le site web que de tirer soi-même des tableaux d'exportation à partir du DLL (IDA, PE Explorer, etc.).

3. les insertions en assembleur (plus précisément, les insertions en code machine). Je vais vous expliquer dans un instant, car la documentation officielle est très vague à cet égard. Les insertions C++ dans MQL4

asm{//или _asm{
   //
   //какой-либо ассемблерный код
   //
}

asm/_asm n'est pas une fonction, mais une directive du préprocesseur, et n'est définie nulle part dans system32/*.dll (voir la recherche sur le site). En d'autres termes, cela n'existe pas.

#import "/Windows/system32/superpuper.dll"
   asm(string& item[]);//в строковый массив заносим команы ассемблера
#import

Vous pouvez écrire du code machine pur en MQL4, mais seulement dans un cas : lorsque, selon la définition de la fonction WinAPI dans le msdn, il devrait passer un pointeur à la fonction/procédure commelpTimerFunc (exemple complet ici sur le forum), dans le msdn il est déclaré comme :

UINT_PTR SetTimer(

    HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc//<-
);

oulpfnWndProc (exempleinachevé ici sur le forum, déclaration msdn et tentative de déclaration de structure mql4). Il n'y a pas d'autre moyen, MQL4 est un interprète, l'adresse de la fonction n'existe pas, il n'y a rien à passer, seulement si le code est écrit en code machine. Ils sont ensuite emballés dans un tableau d'int et passés à la fonction par référence.

Les insertions en assembleur compilé (c'est-à-dire le code machine) ne sont donc pas applicables à cette tâche - elles ont une portée complètement différente. Le mieux que l'on puisse faire est d'exécuter un tel tableau d'int via debug dans cmd via shell32.dll. Il semble que la ligne de commande ne puisse pas y être passée, mais elle peut être écrite en utilisant les touches virtuelles via keybd_event.

4. J'écris ma propre fonction pour convertir un double en int[2] en MQL4 pur sans inserts. Mais j'ai estimé la taille du code et ses performances, et j'ai abandonné. Je n'ai pas encore écrit le module lui-même, mais je crois que l'algorithme est le suivant :

1. Объявляем bool[64].
2. bool[0] равен 0, если плюс, и 1, если минус (отрицательное число то есть).
3. Находим значение выражения целая_часть(log_2(число))+1023. В цикле находим остатки от деления его на 2, заносим их в bool[11]-bool[1]
        в обратном порядке.
4. Разделяем целую и дробную чсти, сохраняем их в разные переменные.
5. Для целой части в цикле находим остаток от деления её на 2, пока не останется остаток от деления 1 или 0, заносим в этом же цикле значения
        в массив с bool[13+log_2(целая_часть)] до bool[12], в обратном порядке.
6. Для дробной части в цикле находим целую часть числа при циклическом умножении на 2. Целую часть запоминаем и отбрасываем, дробную умножаем дальше.
        Цикл до тех пор, пока при умножении в результате не получится 1. Заносим в прямом порядке, т.е. с начала (а начало на следующей ячейке после
        окончания пред. записи).
7. Теперь в цикле собираем в int[2] с конца bool[64], помня, что в int[0] идёт bool[0]-bool[31], а в int[1] идёт bool[32]-bool[63].
8. Ах, да, ещё BigEndian забыл.

Il faudrait beaucoup de temps pour l'exécuter. J'ai donc trouvé la solution la plus évidente et la plus simple.

5. Utilisation d'un dll auto-écrit en C++. Le code est le suivant :

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
    return TRUE;
}

__declspec(dllexport) void __stdcall dtoi(unsigned _int64 Dbl, int iDbl[2])
 {
        iDbl[0]=static_cast<unsigned int>(Dbl);
        iDbl[1]=static_cast<unsigned int>(Dbl>>32);
        return;
 }

Dans le script.

#property show_inputs //для вывода окна с настройкой параметров

#import "double.dll"//самонаписанная dll
   void dtoi(double Dbl, int& iDbl[]);
#import

extern double Dbl=96.578;//в параметрах передаём любую double-переменную
int iDbl[2];//и выходной double->int[2] массив
int handle;//хэндл тестового файла

int start(){
   handle=FileOpen("test.txt",FILE_BIN|FILE_WRITE);//открываем тестовый файл как бинарный "только на запись"
   FileWriteDouble(handle, Dbl);//записываем в тестовый файл double-переменную (8 байт)
   dtoi(Dbl, iDbl);//вызываем функцию конвертации; в iDbl помещается разпарсенный double
   FileWriteArray(handle, iDbl, 0, 2);//записываем в тестовый файл int[2]-переменную (8 байт)
   FileClose(handle);//сначала идут 8 байт double, затем 4+4=8 байт сконвертированных int
   return(0);//Получаем перезаписываемый \experts\files\test.txt в 16 байт.
  }

Int upper[0] est inversé car nous le passons par référence. Nous avons :

...ça a marché, les lignes dans la décharge sont identiques. Dossier attaché, dans celui-ci dans les bibliothèques se trouve double.dll, dans les échantillons - source dll, dans les scripts - script.

Soirée : j'ai retéléchargé l'archive et modifié un peu le code du script et de la dll.

Dossiers :
ftdqcs.zip  57 kb
 

Je ne comprends pas ce que j'ai fait de mal. Pour une raison quelconque, la position ne se ferme pas comme je l'avais prévu ?

Voici le critère d'ouverture d'une position

         if (Ask > iBands(NULL,0,M,2,0,N,MODE_LOWER,0)&& Low [1] < iBands(NULL,0,M,2,0,N,MODE_LOWER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 20 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 20)
           {     
            Opn_B  =  true;     // Критерий открs. Buy
            OpenFunction ( Opn_B,  Opn_S, Lots);     //окрываем позицию
            
           }
         
         if (Bid < iBands(NULL,0,M,2,0,N,MODE_UPPER,0)&& High [1] > iBands(NULL,0,M,2,0,N,MODE_UPPER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 80 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 80)
       
           {   
            Opn_S  =  true;     // Критерий откр. Sell
            OpenFunction ( Opn_B,  Opn_S,  Lots);     //окрываем позицию 
            
           }

Voici le critère pour clôturer une position

if (Bid >= iBands(NULL,0,M,2,0,N,MODE_UPPER,0))    
         {                                                                      
         Cls_B  =  true;     // ... получаем критерий для закрытия позиции Buy
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }
       
       if (Ask <= iBands(NULL,0,M,2,0,N,MODE_LOWER,0))       
         {                                                                      
         Cls_S  =  true;
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }

et voilà ce qu'on obtient :

 
Zhunko:
Non ! Vous ne pouvez pas toucher aux fonctions de la bibliothèque standard ! Dima interdit :-))


Pourquoi faites-vous une blague ici ? S'il y a une erreur, vous devez soit la signaler à Servicedesk, soit faire votre propre copie du fichier.
 
GaNDarM:

Je ne comprends pas ce que j'ai fait de mal. Pour une raison quelconque, la position ne se ferme pas comme je l'avais prévu ?

Voici le critère d'ouverture d'une position

Voici le critère pour clôturer une position

et voilà ce qu'on obtient :


Et à quelle fréquence le critère de fermeture est-il vérifié ? Pas par le bar par hasard ?
 
ilunga:

Et à quelle fréquence le critère de fermeture est-il vérifié ? Pas par des bars par hasard ?

Je ne comprends pas bien l'essentiel de la question. Modèle de test du cours d'ouverture (méthode rapide sur barres formées)
 
J'ai besoin de retirer de l'argent de WMZ à QIWI. Je cherche des personnes pour coopérer. Prêt à prendre une commission d'environ 5%.
 
tpg_k156:
J'ai besoin de retirer de l'argent de WMZ à QIWI. Je cherche des personnes pour coopérer. Je suis prêt à prendre une commission d'environ 5%.
Faites attention aux gens.