【问题标题】:Does ShellExecuteW(...) work only once in MetaTrader 4 or not?ShellExecuteW(...) 在 MetaTrader 4 中是否只工作一次?
【发布时间】:2015-11-10 08:13:45
【问题描述】:

尝试使用 ShellExecuteW()MQL4 启动 .exe

此命令是否只工作一次?

#import "shell32.dll"   // MQL4-syntax-wrapper-Bo[#import]Container
                        // v-------------- caller-side interface to DLL
        int ShellExecuteW( int    hWnd,
                           int    lpVerb,
                           string lpFile,
                           int    lpParameters,
                           int    lpDirectory,
                           int    nCmdShow
                           );
#import                 // MQL4-syntax-wrapper-Eo[#import]Container

if (  cond == true ){
      ShellExecuteW( 0, "open", "D:\\Execute.exe", "", "", 1 );
   }

【问题讨论】:

    标签: algorithmic-trading metatrader4 mt4


    【解决方案1】:

    A:一个简短的版本

    也许是,也许不是。

    A:更深入一点 [TLDR]

    事实: MT4 终端的流程控制/流程管理并无出众之处,但它允许您集成多条控制线来控制 MT4 终端内部(和外部......不仅通过ShellExecuteW(...)......)发生的事情。

    MT4 终端每个 graph 支持以下进程(通过内置线程):

    1. { 0 | 1 } 出现称为 MQL4-ExpertAdvisor 的单例实例
    2. { 0 | 1 } 出现称为 MQL4-脚本 的单例实例
    3. { 0 | 1 ... n } 出现称为 MQL4-TechnicalIndicator 的功能受限实例

    这些实例的性质在几个方面有所不同,但与您的问题最接近的是,每个过程都有一个强制性部分和一组任意部分。

    以原文MQL4说话(可能已经注意到,自从 Build 7xx MQL4 语言语法越来越接近 MQL5,因此有时被标记为 MQL4.5 :o))

    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    //
    // MQL4 code ----------------------------------------------------------<BoF>------
    
    // MQL4 code compiler directives' section -----------------------<BoS>
    
    #import ...                // MQL4-syntax-wrapper-Bo[#import]Container
            ..
            .
    #import                    // MQL4-syntax-wrapper-Eo[#import]Container
    
    // MQL4 code compiler directives' section -----------------------<EoS>
    
    // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    //
    // MQL4 code section ---------------------------- init() / start() / deinit()
    //
    
    int init(){    // this part is being run just once,
                   //                        right upon an instance activation
       }
    
    int start(){   // this part is being run just once, for an MQL4-Script
                   //                        right upon an instance activation
                   //                    run upon an FX-MarketEvent is being observed
                   //                             in an MQL4-ExpertAdvisor
                   //                             or
                   //                             in an MQL4-TechnicalIndicator
    
    
       }
    ...
    ..
    .
    //
    // MQL4 code ---------------------------------------------------------<EoF>------
    //
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    

    因此,部署代码的确切位置(重新)使用通用 DLL 服务(#import-ed 用于编译时对齐和动态链接(重用)决定了多少要求调用外部进程的次数。


    Nota Bene

    有很多更智能的方法可以将 MT4 终端与外部进程或远程进程(云和网格)集成,而不仅仅是基于 DLL 的另一个盲人无法管理的&lt;localhost&gt; 进程的衍生。

    通常需要进程控制和进程之间的双向通信。

    不要犹豫,询问更多。

    MT4(加上一些额外的工具)可以做到。

    【讨论】:

    • 感谢您的回复。您能否分享有关如何处理来自 MT4 的双向通信的任何信息?另外,我应该移动#import 语句以使 ShellExecute 工作吗?
    • 欢迎,尼哈里卡。 #import 编译器指令的位置不是任意的。它必须出现在 MQL4 源代码的初始部分(参考 MQL4 文档/帮助页面,了解所有与语法相关的详细信息和相应的指令)。问题是,您的 ShellExecuteW(...) 等 DLL 服务调用 ( invocation ) 所在的位置,而不是 #import 指令本身。
    • n.b.: 小心控制机制以产生外部进程。要理解这个问题,只需想象一个简单的循环for ( int nInstances = 0; nInstances &lt; 10; nInstances++ ){ ShellExecuteW( ... , "cmd.exe", ... ); Print( "Loop spawned ", nInstances, " already..." ) },其中 10 将变为 100100010000 ...所以要小心。
    • 我仍然无法正常工作:( 我从 EA 调用 ShellExecuteW(..),具体取决于我从自定义指标获得的值,如下所示 indicatorReturn = iCustom(NULL,0," IndicatorSample",0,0); 调用 .exe 的条件 if(indicatorReturn != Empty){ Call shellexecuteW }..
    • 如何以管理员身份(在 Win8.1 操作系统中)从 ShellExecuteW 运行 .exe(stoit 脚本)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 2013-12-31
    相关资源
    最近更新 更多