[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 289

 
qwert2 :
스크립트를 전문가들과 함께 폴더로 옮기기만 하면 어떻게 되는지 적어봤습니다. 작동하지만 제대로 작동하지 않습니다. 스크립트는 8개의 보류 주문을 생성하고 전문가가 있는 폴더에 저장하기만 하면 매 틱 후에 8개의 보류 주문이 생성됩니다. 그리고 이전 주문이 닫힌 후에만 새로운 8개 주문을 연기하려면 필요합니다.

대본에 "연기"만 썼습니까? 그런 다음 그는 연기 할 것입니다. 얼마나 많은 진드기가 올 것입니까? 그래서 그는 세금을 부과 할 것입니다 ... 오 ... 연기합니다.

거기에 다른 체커 배너를 밀어 넣어야합니다 ...

 
qwert2 :
스크립트만 전문가가 있는 폴더로 옮기면 어떻게 되는지 적어봤습니다. 작동하지만 제대로 작동하지 않습니다. 스크립트는 8개의 보류 주문을 생성하고 전문가가 있는 폴더에 저장하기만 하면 매 틱 후에 8개의 보류 주문이 생성됩니다. 그리고 이전 주문이 닫힌 후에만 새로운 8개 주문을 연기하려면 필요합니다.
질문에 없었습니다. 이것은 더 이상 전문가로 변환되는 스크립트로 간주되지 않습니다. 이것은 프로그램의 다른 구현입니다.
 
Roger :

오류를 찾았습니다. 줄에 있는 이 함수에 대한 라이브러리에서

13, 14 및 15번째 숫자에서 0으로 제거해야 합니다.


이제 맞아



안녕하세요 라이브러리 기능입니다.
 
Roger:

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

Теперь правильно
타라 :
안녕하세요 라이브러리 기능입니다.
아니다! 표준 라이브러리의 기능은 만질 수 없습니다! 디마 금지 :-))
 
artmedia70 :

대본에 "연기"만 썼습니까? 그런 다음 그는 연기 할 것입니다. 얼마나 많은 진드기가 올 것입니까? 그래서 그는 세금을 부과 할 것입니다 ... 오 ... 연기합니다.

거기에 다른 체커 배너를 밀어 넣어야합니다 ...


))))) 나는 저항할 수 없었다)))))

자, 이제 요점으로. 저는 두 번째 TF의 코드를 최적화하는 작업을 하고 있으며, 한 블록에 RateInfo 구조를 작성하기 위해 double을 int[2]로 변환하기 시작했습니다. 나는 생각하고 생각했고 가능한 모든 것을 그리기로 결정했습니다. 누군가의 실수를 방지할 수 있는 실현 불가능한 방법.

1. WinAPI(msdn). 일반적으로 고양이는 변환 기능에 대해 울었습니다. 이것은 변환하는 동안 C 유형의 번역이 널리 사용되기 때문입니다.

 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

끝에서 두 번째 줄에서 int i1은 char로 변환되고 마지막 줄에서는 char s2가 int로 변환됩니다. 결과적으로이 모든 경제는 소위에서 조화롭게 사용됩니다. "변환 함수"는 실제로 WinAPI dll에 없으며 다음과 같은 매크로에 의해 헤더 .h 파일에서만 선언됩니다.

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

컴파일하는 동안 전처리기에 의해 첫 번째 코드와 같은 문자열로 확장됩니다. 그리고 헤더 .h 파일은 dll이 아니며 개발 환경(Studio, Borland, gcc 등)에서만 사용됩니다. MQL4가 춥지도 덥지도 않은 이유는 무엇입니까? 그러나 함수가 실제로 헤더 .h-file에만 선언되어 있는지 또는 System32의 일부 dll에서 엿보는 눈으로부터 숨겨져 내보낸 함수의 어딘가에 있는지 항상 다시 확인할 수 있습니다. 이제 방법을 설명하겠습니다.

2. WinAPI(dll CRT). 이러한 dll의 이름은 msvcp*, msvcr*, msvcrt*, msvci*, msvcirt입니다. 여기에서 선택의 폭이 더 넓습니다: _atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtol 이름에 있는 기호의 의미는 다음과 같습니다.

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

하지만 예상했던 _dtoi64 / _dtoi64는 존재하지 않았고 존재하지도 않습니다. msvcrt*, msvci*, msvcirt.dll에 정의된 것을 사용하십시오.

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

회피하더라도 파일 작업으로만 가능합니다(콘솔임).

사이트에서 msdn 외에 검색할 수 있습니다 . 여기 사이트 의 검색 표시줄이 있습니다. 유사한 "편리한" msdn 검색 문자열이 여기에 있습니다 . 차이점은 무엇입니까? msdn에 기능에 대한 좋은 설명이 있지만 일부는 전혀 그렇지 않습니다(예: NativeAPI). 대안으로 시스템 dll을 내보내기 위한 테이블이 있지만 설명은 없습니다. 원칙적으로 사이트의 내보내기 테이블 세트는 dll(IDA, PE 탐색기 등)에서 직접 내보내기 테이블을 가져오는 것보다 쉽습니다.

3. 어셈블러 인서트(더 정확하게는 기계어에 인서트). 이제 설명하겠습니다. 왜냐하면. 이와 관련하여 공식 문서는 매우 모호합니다. MQL4 C++에서

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

실현할 수 없기 때문에 asm/_asm은 함수가 아니라 전처리기 지시문이며 system32/*.dll 어디에도 정의되어 있지 않습니다(해당 사이트에서 검색 참조). 다시 말해 그런 게 없다.

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

순수 네이티브 코드에서는 MQL4로 작성할 수 있지만 한 가지 경우에만 가능합니다. msdn의 WinAPI 함수 정의에 따라 lpTimerFunc 유형의 함수/프로시저에 대한 포인터를 전달해야 하는 경우(완전한 포럼에 있음), msdn에서는 다음과 같이 선언됩니다.

UINT_PTR SetTimer(

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

또는 lpfnWndProc(포럼의 미완성 예제 , msdn 선언 및 시도된 mql4 구조 선언). 그렇지 않으면 방법이 없습니다. MQL4는 인터프리터이고, 함수의 주소는 존재하지 않으며, 기계 코드로 작성된 경우에만 전송할 수 없습니다. 그런 다음 int 배열로 압축되고 배열은 함수에 대한 참조로 전달됩니다.

따라서 컴파일된 어셈블러 삽입(즉, 기계어 코드)은 이 작업에 적용할 수 없습니다. 완전히 다른 범위를 갖습니다. 이것에서 짜낼 수 있는 최대값은 shell32.dll을 통해 cmd에서 디버그를 통해 이러한 int 배열을 실행하는 것입니다. 거기에 커맨드 라인을 옮기는 것은 불가능해 보이지만 keybd_event를 통해 가상 키로 쓸 수 있습니다.

4. 삽입 없이 순수 MQL4에서 double을 int[2]로 변환하는 함수를 작성합니다. 그러나 나는 코드의 양과 그 성능의 속도를 알아냈지만 나는 그냥 거절했다. 모듈 자체를 작성하지도 않았지만 알고리즘은 내가 이해한 대로 다음과 같습니다.

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

완료하는 데 매우 오랜 시간이 걸립니다. 그래서 가장 명확하고 간단한 해결책을 찾았습니다.

5. C++에서 자체 작성 dll 사용. 코드는 다음과 같이 나왔습니다.

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

스크립트에서

#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 ]에서 참조로 전달하기 때문에 다시 변경됩니다. 우리는 다음을 얻습니다.

... 작동했습니다. 덤프의 줄이 동일합니다. 나는 폴더를 첨부하고 있습니다. 라이브러리에는 double.dll이 있고 샘플에는 dll 소스가 있고 스크립트에는 스크립트가 있습니다.

저녁: 아카이브를 다시 업로드하고 스크립트 코드와 dll을 약간 위조했습니다.

파일:
ftdqcs.zip  57 kb
 

내가 뭘 잘못했는지 이해가 안 돼요. 어떤 이유로 포지션 청산이 계획대로 되지 않습니까?

다음은 포지션을 여는 기준입니다

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

포지션을 청산하는 기준은 다음과 같습니다.

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

다음은 우리가 얻은 것입니다.

 
Zhunko :
아니다! 표준 라이브러리의 기능은 만질 수 없습니다! 디마 금지 :-))


글쎄, 당신은 여기에서 무엇을 하고 있습니까? 오류가 있는 경우 서비스 데스크에 보고하거나 파일 사본을 직접 만들어야 합니다.
 
GaNDarM :

내가 뭘 잘못했는지 이해가 안 돼요. 어떤 이유로 포지션을 청산하는 것이 계획대로 일어나지 않습니까?

다음은 포지션을 여는 기준입니다

포지션을 청산하는 기준은 다음과 같습니다.

그리고 여기 우리가 얻는 것이 있습니다:


마감 기준은 얼마나 자주 확인됩니까? 혹시 술집에 있지 않습니까?
 
ilunga :

마감 기준은 얼마나 자주 확인됩니까? 혹시 술집에 있지 않습니까?

질문의 요지를 잘 이해하지 못했습니다. 공개 가격으로 모델 테스트(성형 막대에 대한 빠른 방법)
 
WMZ에서 QIWI로 돈을 인출해야 합니다. 협력하실 분들을 구합니다. 약 5% 수수료를 받을 준비가 되었습니다.