[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 289

 
qwert2:
我已经写了如果你只是把脚本移到一个有专家的文件夹里会发生什么。它是有效的,但不是以它应该的方式。脚本创建了8个挂单,但如果我们只是把它保存在有专家顾问的文件夹中,它在每个tick之后都会创建8个挂单。我需要它在旧订单结束后才下8个新订单。

你在剧本中只写了一个 "推迟 "吗?然后,它只会拖延:有多少虱子就来多少虱子......。哎呀......。.........

你必须在其中加入第三个检查器抑制剂...

 
qwert2:
如果只是把脚本移到专家文件夹中,就会出现这种情况。它是有效的,但不是它应该的方式。该脚本创建了8个挂单,但如果你只是把它保存在Expert Advisors文件夹中,它在每个tick之后都会创建8个挂单。我需要它在旧订单结束后才下8个新订单。
你的问题中没有提到这一点。如何把脚本改成专家顾问,这并不重要。这是该计划的另一项实施。
 
Roger:

我发现了一个错误。在这个函数的库中的一行

应删除第13、14和15个数字中的每一个零。


现在正确



你好,库函数。
 
Roger:

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

Теперь правильно
tara:
Hello库函数。
不!你不能碰标准库中 的函数。迪马被禁 :-))
 
artmedia70:

你在剧本中只写了一个 "推迟 "吗?然后,它只会拖延:有多少虱子就来多少虱子......。哎呀......。.........

你也需要在那里放一个禁酒令检查器......


)))))不能抵制)))))

好了,让我们开始谈正事。我正在对第二个TF的代码进行优化,我决定把double翻译成int[2],以便在一个块中写出RateInfo结构。我想了想,决定描述所有可能的方法,包括无法实现 的方法,这样就可以提醒某人不要犯错。

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-文件中声明,或在System32中某些dll的隐藏的、不被窥视的导出函数中。

2) WinAPI(CRT dll)。这些dlls被命名为msvcp*、msvcr*、msvcrt*、msvci*、msvcirt。这里的选择更广泛:_atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoul。名字中的符号有以下含义。

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

但预期的_dtoi64/_dtoui64仍然没有出现。另一方面,使用msvcrt*、msvci*、msvcirt.dll的定义

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

是唯一可用的,即使你被扭曲了,作为一个文件操作(这些是控制台操作)。

你可以搜索,除了msdn,这个网站 上,这里是网站搜索栏一个类似的 "方便的 "msdn搜索字符串 在这里。它们有什么不同?msdn对功能有很好的描述,但有些功能根本不存在(例如NativeAPI)。另一方面,在另一种情况下,任何系统的dll导出表都在那里,但没有描述。基本上,网站上的一套导出表比自己从dll(IDA、PE Explorer等)中拉出导出表要容易。

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中把双倍数转换成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,在样本中是source dll,在脚本中是script。

晚上:重新下载了档案,并对脚本和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:
不!你不能碰标准库中的函数。迪马被禁 :-))


你为什么要在这里做一个小丑呢?如果有错误,你需要向servicedesk报告,或者自己制作文件的副本。
 
GaNDarM:

我不明白我做错了什么。由于某些原因,该职位没有按我的计划关闭?

以下是建仓的标准

以下是平仓的标准

而这就是我们得到的结果。


那么多长时间检查一次关闭标准?不可能是在酒吧吧?
 
ilunga:

那么多长时间检查一次关闭标准?不可能是在酒吧吧?

我不太明白这个问题的要点。开盘价 测试模型(在成型条上的快速方法)。
 
需要从WMZ提钱到QIWI。寻找人合作。准备抽取约5%的佣金