[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 289

 
qwert2:
Ich habe geschrieben, was passiert, wenn Sie das Skript einfach in einen Ordner mit Experten verschieben. Es funktioniert, aber nicht so, wie es sollte. Das Skript erstellt 8 Pending Orders, aber wenn wir es nur im Ordner mit Expert Advisors speichern, erstellt es 8 Pending Orders nach jedem Tick. Ich brauche es, um 8 neue Aufträge erst dann zu erteilen, wenn die alten abgeschlossen sind.

Haben Sie nur eine "Verschiebung" in Ihr Drehbuch geschrieben? Dann wird er nur zögern: Es kommen so viele Zecken rein, wie er braucht... Ups... .........

Sie müssen einen dritten Checker-Inhibitor hinzufügen...

 
qwert2:
Dies geschieht, wenn das Skript einfach in den Ordner "Experten" verschoben wird. Es funktioniert, aber nicht so, wie es sollte. Das Skript erstellt 8 schwebende Aufträge, aber wenn Sie es nur im Expertenordner speichern, erstellt es nach jedem Tick 8 schwebende Aufträge. Ich brauche es, um 8 neue Aufträge erst dann zu erteilen, wenn die alten abgeschlossen sind.
Dies wurde in Ihrer Frage nicht erwähnt. Es spielt keine Rolle, wie Sie das Skript in einen Expert Advisor umwandeln. Dies ist eine weitere Umsetzung des Programms.
 
Roger:

Ich habe einen Fehler gefunden. In der Bibliothek für diese Funktion in der Zeile

sollte in der 13., 14. und 15. Zahl jeweils die Null löschen.


Jetzt richtig



Hallo Bibliotheksfunktionen.
 
Roger:

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

Теперь правильно
tara:
Hallo Bibliotheksfunktionen.
Nein! Sie können keine Funktionen aus der Standardbibliothek anfassen! Dima verbannt :-))
 
artmedia70:

Haben Sie nur eine "Verschiebung" in Ihr Drehbuch geschrieben? Dann wird er nur zögern: Es kommen so viele Zecken rein, wie er braucht... Ups... .........

Sie müssen dort auch einen Verbots-Checker einbauen...


))))) Kann nicht widerstehen)))))

Also gut, kommen wir zur Sache. Ich arbeite an der Optimierung des Codes der zweiten TF, ich habe beschlossen, double in int[2] zu übersetzen, um die RateInfo-Struktur in einen Block zu schreiben. Ich habe darüber nachgedacht und beschlossen, alle möglichen Wege zu beschreiben, auch dienicht realisierbaren, damit jemand vor Fehlern gewarnt werden kann.

1. die WinAPI (msdn). Im Allgemeinen gibt es nicht viel an Umrechnungsfunktionen. Dies liegt daran, dass bei der Konvertierung ausgiebig von der c-Typ-Übersetzung Gebrauch gemacht wird, die in etwa wie folgt aussieht

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

in der vorletzten Zeile wirdint i1 in char umgewandelt und in der letzten Zeile wird char s2 in int umgewandelt. Das Ergebnis ist, dass all diese Dinge in so genannten "Konvertierungsfunktionen" verwendet werden, die in Wirklichkeit in keiner WinAPI-DLL enthalten sind, sondern in Header-.h-Dateien mit Makros wie

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

die der Präprozessor bei der Kompilierung wie im ersten Code in einen String umwandelt. Und Header-.h-Dateien sind keine DLLs und werden nur in der Entwicklungsumgebung (Studio, Borland, gcc, etc.) verwendet. Daher ist es weder gut noch schlecht für MQL4. Sie können jedoch immer überprüfen, ob die Funktion nur in der Header-.h-Datei oder in den vor neugierigen Augen versteckten exportierten Funktionen einer Dll in System32 deklariert ist.

2) WinAPI (CRT dll). Diese DLLs heißen msvcp*, msvcr*, msvcrt*, msvci*, msvcirt. Hier ist die Auswahl größer: _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoul. Die Symbole im Namen haben die folgende Bedeutung:

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

Aber das erwartete _dtoi64/_dtoui64 fehlt immer noch. Die Verwendung der Definitionen msvcrt*, msvci*, msvcirt.dll hingegen

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

ist nur als Datei-Operation verfügbar, auch wenn Sie sich verheddern (es handelt sich um Konsolenoperationen).

Sie können neben msdn auch aufdieser Websitesuchen, hier ist die Suchleiste der Website. Ein ähnlicher "praktischer" msdn-Suchbegriff findet sich hier. Wie unterscheiden sie sich? Die msdn hat eine gute Beschreibung der Funktionen, aber einige sind überhaupt nicht vorhanden (NativeAPI, zum Beispiel). In der alternativen Version hingegen ist zwar jede System-DLL-Exporttabelle vorhanden, aber keine Beschreibung. Grundsätzlich ist ein Satz von Exporttabellen auf der Website einfacher, als selbst Exporttabellen aus der DLL zu ziehen (IDA, PE Explorer, etc.).

3. Assembler-Einfügungen (genauer gesagt, Maschinencode-Einfügungen). Ich werde das gleich erklären, denn die offiziellen Unterlagen sind in dieser Hinsicht sehr vage. Die C++ Einsätze in MQL4

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

asm/_asm ist keine Funktion, sondern eine Präprozessoranweisung und ist nirgendwo in system32/*.dll definiert (siehe Suche auf der Website). Mit anderen Worten: So etwas gibt es nicht.

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

Sie können reinen Maschinencode in MQL4 schreiben, aber nur in einem Fall: wenn laut Definition WinAPI-Funktion in msdn sollte es einen Zeiger auf Funktion/Prozedur wielpTimerFunc übergeben(komplettesBeispiel hier im Forum), in msdn ist es deklariert als:

UINT_PTR SetTimer(

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

oderlpfnWndProc (unfertigesBeispiel hier im Forum, msdn-Deklaration und versuchte mql4-Strukturdeklaration). Es gibt keinen anderen Weg, MQL4 ist ein Interpreter, die Adresse der Funktion gibt es nicht, es gibt nichts zu übergeben, nur wenn der Code in Maschinencode geschrieben ist. Sie werden dann in ein int-Array gepackt und per Referenz an die Funktion übergeben.

Kompilierte Assembler-Inserts (d.h. Maschinencode) sind also für diese Aufgabe nicht geeignet - sie haben einen völlig anderen Anwendungsbereich. Es scheint, dass die Befehlszeile dort nicht übergeben werden kann, aber sie kann mit den virtuellen Tasten über keybd_event geschrieben werden.

4. Ich schreibe meine eigene Funktion, um double in int[2] in reinem MQL4 ohne Einfügungen zu konvertieren. Aber ich habe die Größe des Codes und seine Leistung abgeschätzt und aufgegeben. Ich habe das Modul selbst noch nicht geschrieben, aber ich glaube, der Algorithmus sieht folgendermaßen aus:

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 забыл.

Die Ausführung würde sehr lange dauern. So kam ich schließlich auf die offensichtlichste und einfachste Lösung

5. Verwendung einer selbst geschriebenen DLL in C++. Der Code lautet wie folgt:

#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;
 }

Im Drehbuch.

#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] ist umgekehrt, weil wir es per Referenz übergeben. Wir bekommen:

...es hat funktioniert, die Zeilen im Dump sind identisch. Angehängter Ordner, darin in Bibliotheken ist double.dll, in Samples - source dll, in Skripte - Skript.

Am Abend habe ich das Archiv erneut heruntergeladen und den Skript- und DLL-Code ein wenig verändert.

Dateien:
ftdqcs.zip  57 kb
 

Ich verstehe nicht, was ich falsch gemacht habe. Aus irgendeinem Grund wird die Position nicht wie geplant geschlossen?

Hier das Kriterium für die Eröffnung einer 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);     //окрываем позицию 
            
           }

Das ist das Kriterium für die Schließung einer 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;
         }

und das ist, was wir bekommen:

 
Zhunko:
Nein! Sie können keine Funktionen aus der Standardbibliothek anfassen! Dima verbannt :-))


Warum machen Sie hier eine Clownerie? Wenn ein Fehler vorliegt, müssen Sie ihn entweder an servicedesk melden oder eine eigene Kopie der Datei erstellen.
 
GaNDarM:

Ich verstehe nicht, was ich falsch gemacht habe. Aus irgendeinem Grund wird die Position nicht wie geplant geschlossen?

Hier das Kriterium für die Eröffnung einer Position

Das ist das Kriterium für die Schließung einer Position

und das ist, was wir bekommen:


Und wie oft wird das Abschlusskriterium überprüft? Nicht zufällig in einer Bar?
 
ilunga:

Und wie oft wird das Abschlusskriterium überprüft? Nicht zufällig von Bars?

Ich verstehe den Sinn der Frage nicht ganz. Eröffnungskurs-Testmodell (Schnellmethode auf geformten Balken)
 
Ich muss Geld von WMZ nach QIWI abheben. Ich suche Leute, die mitmachen. Bereit, etwa 5% Provision zu nehmen
Grund der Beschwerde: