[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 289

 
qwert2:
He escrito lo que sucede si sólo se mueve la secuencia de comandos a una carpeta con los expertos. Funciona, pero no como debería. El script crea 8 órdenes pendientes pero si lo guardamos en la carpeta con Asesores Expertos, crea 8 órdenes pendientes después de cada tick. Lo necesito para hacer 8 nuevos pedidos sólo después de cerrar los antiguos.

¿Ha escrito sólo un "aplazamiento" en su guión? Entonces sólo procrastinará: entrarán tantos ticks como haga falta... oops... .........

Tienes que añadir un tercer chequeador-inhibidor en él...

 
qwert2:
Esto es lo que sucede si el script se mueve simplemente a la carpeta de expertos. Funciona, pero no como debería. El script crea 8 órdenes pendientes, pero si lo guardas en la carpeta de expertos, crea 8 órdenes pendientes después de cada tick. Lo necesito para hacer 8 nuevos pedidos sólo después de cerrar los antiguos.
Esto no se mencionó en su pregunta. No importa cómo cambiar el script en un Asesor Experto. Esta es otra aplicación del programa.
 
Roger:

He encontrado un error. En la biblioteca de esta función en la línea

debe borrar el cero en cada uno de los números 13, 14 y 15.


Ahora correctamente



Funciones de la biblioteca Hello.
 
Roger:

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

Теперь правильно
tara:
Funciones de la biblioteca Hello.
¡No! ¡No puedes tocar funciones de la biblioteca estándar! Dima prohibido :-))
 
artmedia70:

¿Ha escrito sólo un "aplazamiento" en su guión? Entonces sólo procrastinará: entrarán tantos ticks como haga falta... oops... .........

También hay que poner un comprobador de prohibiciones...


))))) No se puede resistir)))))

Muy bien, vayamos al grano. Estoy trabajando en la optimización del código de la segunda TF, he decidido traducir double en int[2] para escribir la estructura RateInfo en un solo bloque. He pensado en ello y he decidido describir todas las formas posibles, inclusolas irrealizables, para que alguien pueda estar prevenido contra los errores.

1. WinAPI (msdn). En general, no hay mucho en términos de funciones de conversión. Esto se debe a que la conversión hace un amplio uso de la traducción del tipo c, que es algo así como

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

en la penúltima líneaint i1 se convierte en char y en la última línea char s2 se convierte en int. Como resultado, todo este material se utiliza en las llamadas "funciones de conversión", que en realidad no están en ninguna dll de WinAPI, sino que se declaran en archivos de cabecera .h utilizando macros como

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

que en tiempo de compilación el preprocesador desenrolla en cadena como en el primer código. Y los archivos de cabecera .h no son dll y sólo se utilizan en el entorno de desarrollo (Studio, Borland, gcc, etc). Por lo tanto, no es ni bueno ni malo para MQL4. Sin embargo, siempre se puede comprobar si la función está declarada sólo en el archivo .h de cabecera o en funciones exportadas ocultas de alguna dll en System32.

2) WinAPI (CRT dll). Estos dlls se llaman msvcp*, msvcr*, msvcrt*, msvci*, msvcirt. Aquí la elección es más amplia: _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoul. Los símbolos del nombre tienen el siguiente significado:

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

Pero el esperado _dtoi64/_dtoui64 sigue sin aparecer. Por otro lado, utilizando las definiciones msvcrt*, msvci*, msvcirt.dll

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

sólo está disponible, incluso si se tuerce, como una operación de archivo (son operaciones de consola).

Usted puede buscar, además de msdn, eneste sitio, aquí está la barra de búsqueda del sitio. Una cadena de búsqueda msdn "práctica" similar está aquí. ¿En qué se diferencian? El msdn tiene una buena descripción de las funciones, pero algunas no están en absoluto (NativeAPI, por ejemplo). En cambio, en la alternativa aparece cualquier tabla de exportación de dlls del sistema, pero no hay descripción. Básicamente, un conjunto de tablas de exportación en el sitio web es más fácil que sacar las tablas de exportación de la dll usted mismo (IDA, PE Explorer, etc.).

3. inserciones en ensamblador (más exactamente, inserciones en código máquina). Lo explicaré en un momento, ya que la documentación oficial es muy imprecisa al respecto. Las inserciones C++ en MQL4

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

asm/_asm no es una función, sino una directiva de preprocesador, y no está definida en ninguna parte de system32/*.dll (ver búsqueda en el sitio). En otras palabras, no existe tal cosa.

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

Se puede escribir código máquina puro en MQL4 pero sólo en un caso: cuando según la definición WinAPI-función en msdn debe pasar un puntero a función/procedimiento comolpTimerFunc (ejemplo completo aquí en el foro), en msdn se declara como:

UINT_PTR SetTimer(

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

olpfnWndProc (ejemploinacabado aquí en el foro, declaración msdn e intento de declaración de estructura mql4). No hay otra manera, MQL4 es un intérprete, la dirección de la función no existe, no hay nada que pasar, sólo si el código está escrito en código máquina. A continuación, se empaquetan en una matriz int y se pasan a la función por referencia.

Por lo tanto, las inserciones compiladas en ensamblador (es decir, el código máquina) no son aplicables a esta tarea, ya que tienen un alcance completamente diferente. Lo máximo que se puede conseguir es ejecutar dicha matriz int a través de la depuración en cmd a través de shell32.dll. Parece que la línea de comandos no se puede pasar allí, pero se puede escribir utilizando las teclas virtuales a través de keybd_event.

4. Escribiendo mi propia función para convertir double en int[2] en MQL4 puro sin inserciones. Pero he estimado el tamaño del código y su rendimiento, y he desistido. Ni siquiera he escrito el módulo en sí, pero creo que el algoritmo es el siguiente:

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

Se necesitaría mucho tiempo para ejecutarlo. Así que finalmente llegué a la solución más obvia y fácil

5. Uso de una dll autoescrita en C++. El código es el siguiente:

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

En el guión.

#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 superior[0] se invierte porque lo pasamos por referencia. Lo conseguimos:

...ha funcionado, las líneas del volcado son idénticas. Carpeta adjunta, en ella en las bibliotecas está double.dll, en las muestras - source dll, en los scripts - script.

Noche: he vuelto a descargar el archivo y he manipulado un poco el código del script y del dll.

Archivos adjuntos:
ftdqcs.zip  57 kb
 

No entiendo qué he hecho mal. Por alguna razón la posición no se cierra como había planeado?

Este es el criterio para abrir una posición

         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);     //окрываем позицию 
            
           }

Este es el criterio para cerrar una posición

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

y esto es lo que obtenemos:

 
Zhunko:
¡No! ¡No puedes tocar funciones de la biblioteca estándar! Dima prohibido :-))


¿Por qué haces una payasada aquí? Si hay un error, hay que comunicarlo a servicedesk o hacer una copia propia del archivo.
 
GaNDarM:

No entiendo qué he hecho mal. Por alguna razón la posición no se cierra como había planeado?

Este es el criterio para abrir una posición

Este es el criterio para cerrar una posición

y esto es lo que obtenemos:


¿Y con qué frecuencia se comprueba el criterio de cierre? ¿Por casualidad no por el bar?
 
ilunga:

¿Y con qué frecuencia se comprueba el criterio de cierre? ¿Por casualidad no es por bares?

No entiendo bien el sentido de la pregunta. Modelo de comprobación del precio de apertura (método rápido en barras formadas)
 
Necesito retirar dinero de WMZ a QIWI. Busco gente que colabore. Dispuesto a aceptar una comisión de alrededor del 5%.
Razón de la queja: