找回密码
 立即注册

国内期货交易EA定制:期货跟单MT4MT5开源代码

[复制链接]

国内期货交易EA定制:期货跟单MT4MT5开源代码

[复制链接]
admin

191

主题

32

回帖

1万

积分

管理员

积分
15282
2024-11-6 10:13:40 | 显示全部楼层 |阅读模式
本程序适合跟单交易,只要在MT4或者MT5上写好跟单代码即可实现下单到期货账户

实现逻辑:
1.MtctpServer.exe 负责登录期货账户并同时开通http服务器默认80端口,
2.使用MT4或者MT5的WebRequest进行提交下单


期货账户信息在Accountlogin.json里面配置好即可,可以实现多账户操作,默认只开通了十个
启动程序后 当界面显示出来账户和总权益即表示登录成功,此时就可以提交下单了

程序免费使用,带来的任何问题自己负责,开发这个小工具纯属个人爱好,有时间也会更新功能。目前仅仅是个玩具,实现不了复杂的操作。


目前期货MT5:赫兹和MT5CTP两个平台做的比较好,本人均可代写他们的期货EA
赫兹地址:https://www.herzqt.com/?mark=YBZO4K4



期货跟单MT4MT5免费版

期货跟单MT4MT5免费版

期货跟单MT4MT5免费版

期货跟单MT4MT5免费版




期货跟单MT4MT5免费版

期货跟单MT4MT5免费版


WebRequest提交链接支持浏览器直接访问


期货跟单MT4MT5免费版

期货跟单MT4MT5免费版


以下是MT4/5的代码(需要在软件打钩允许WebRequest)


  1. //+------------------------------------------------------------------+
  2. //|                                                      ProjectName |
  3. //|                                      Copyright 2018, CompanyName |
  4. //|                                       http://www.companyname.net |
  5. //+------------------------------------------------------------------+
  6. #property   copyright     "不才编程"
  7. #property   link          "http://www.mtctp.com/"
  8. #property   description   "www.mtctp.com"
  9. #property   description   "\n业务范围  :专业MT4MT5EA指标脚本编程"
  10. #property   description   "\n联系方式  :微信:bucaiea / QQ;280726108"
  11. #property   version       "1.0"
  12. #property   strict



  13. input string  url="http://127.0.0.1/";
  14. input int     手数=1;
  15. input int     账号=228732;
  16. input bool    等待同步返回信息=true;
  17. input int     同步信息等待毫秒=500;//同步信息等待毫秒
  18. //等待时间长降低效率,时间短可能还没有返回信息。



  19. datetime settime;
  20. //+------------------------------------------------------------------+
  21. //|                                                                  |
  22. //+------------------------------------------------------------------+
  23. int OnInit()
  24.   {
  25.    settime=TimeCurrent();
  26.    EventSetMillisecondTimer(100);
  27.    Comment(url);
  28.    return(INIT_SUCCEEDED);
  29.   }
  30. //+------------------------------------------------------------------+
  31. //|                                                                  |
  32. //+------------------------------------------------------------------+
  33. void OnDeinit(const int reason)
  34.   {
  35.    EventKillTimer();
  36.    for(int i=ObjectsTotal(0,-1,-1)-1; i>=0; i--)
  37.       if(StringFind(ObjectName(0,i),m_url,0)!=-1)
  38.          ObjectDelete(0,ObjectName(0,i));
  39.    Comment("");
  40.   }
  41. //+------------------------------------------------------------------+
  42. //|                                                                  |
  43. //+------------------------------------------------------------------+
  44. void OnTick()
  45.   {

  46.   }
  47. //+------------------------------------------------------------------+
  48. //|                                                                  |
  49. //+------------------------------------------------------------------+
  50. void OnChartEvent(const int id,
  51.                   const long& lparam,
  52.                   const double& dparam,
  53.                   const string& sparam
  54.                  )
  55.   {

  56. //+------------------------------------------------------------------+
  57. //|                 下单和平仓
  58. //+------------------------------------------------------------------+
  59.    Createbutton(m_url+"做多"," 做多 ...","做多",155,35+105,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  60.    Createbutton(m_url+"做空"," 做空 ...","做空",155,35+70,150,28,CORNER_RIGHT_LOWER,clrCrimson,clrWhite,10);
  61.    Createbutton(m_url+"平多"," 平多 ...","平多",155,35+35,150,28,CORNER_RIGHT_LOWER,clrSkyBlue,clrNavy,10);
  62.    Createbutton(m_url+"平空"," 平空 ...","平空",155,35,150,28,CORNER_RIGHT_LOWER,clrLightSalmon,clrNavy,10);
  63.    ObjectSetInteger(0,m_url+"账号",OBJPROP_STATE,0);
  64.    if(ObjectGetInteger(0,m_url+"做多",OBJPROP_STATE)==1)
  65.      {
  66.       OrderSend(Symbol(),0,手数,账号);
  67.       ObjectSetInteger(0,m_url+"做多",OBJPROP_STATE,0);
  68.      }
  69.    if(ObjectGetInteger(0,m_url+"做空",OBJPROP_STATE)==1)
  70.      {
  71.       OrderSend(Symbol(),1,手数,账号);
  72.       ObjectSetInteger(0,m_url+"做空",OBJPROP_STATE,0);
  73.      }

  74.    if(ObjectGetInteger(0,m_url+"平多",OBJPROP_STATE)==1)
  75.      {
  76.       OrderClose(Symbol(),0,手数,账号);
  77.       ObjectSetInteger(0,m_url+"平多",OBJPROP_STATE,0);
  78.      }
  79.    if(ObjectGetInteger(0,m_url+"平空",OBJPROP_STATE)==1)
  80.      {
  81.       OrderClose(Symbol(),1,手数,账号);
  82.       ObjectSetInteger(0,m_url+"平空",OBJPROP_STATE,0);
  83.      }
  84. //+------------------------------------------------------------------+
  85. //|                 查询信息 如果查询返回"Querying, please try again later..."请过几秒再查询(此时请求已经提交)
  86. //|                 这个接口是在本地查询内存记录,不涉及频率限制,但是这个数据不会自动更新 也就是返回的是最近查询的数据
  87. //+------------------------------------------------------------------+
  88.    Createbutton(m_url+"查询持仓汇总"," 查询持仓汇总 ...","查询持仓汇总",155,35+105+50,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  89.    Createbutton(m_url+"查询持仓明细"," 查询持仓明细 ...","查询持仓明细",155,35+105+50+50,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  90.    Createbutton(m_url+"查询资金明细"," 查询资金明细 ...","查询资金明细",155,35+105+50+100,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  91.    Createbutton(m_url+"查询合约"," 查询合约 ...","查询合约",155,35+105+50+100+50,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  92.    Createbutton(m_url+"查询市场深度"," 查询市场深度 ...","查询市场深度",155,35+105+50+100+100,150,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  93.    Createbutton(m_url+"账号","账号:"+string(账号),"账号:"+string(账号),155,35+105+50+100+150,150,28,CORNER_RIGHT_LOWER,clrYellow,clrNavy,10);
  94.    if(ObjectGetInteger(0,m_url+"查询持仓汇总",OBJPROP_STATE)==1)
  95.      {
  96.       Print(查询持仓汇总(账号));
  97.       ObjectSetInteger(0,m_url+"查询持仓汇总",OBJPROP_STATE,0);
  98.      }
  99.    if(ObjectGetInteger(0,m_url+"查询持仓明细",OBJPROP_STATE)==1)
  100.      {
  101.       Print(查询持仓明细(账号));
  102.       ObjectSetInteger(0,m_url+"查询持仓明细",OBJPROP_STATE,0);
  103.      }
  104.    if(ObjectGetInteger(0,m_url+"查询资金明细",OBJPROP_STATE)==1)
  105.      {
  106.       Print(查询资金明细(账号));
  107.       ObjectSetInteger(0,m_url+"查询资金明细",OBJPROP_STATE,0);
  108.      }
  109.    if(ObjectGetInteger(0,m_url+"查询合约",OBJPROP_STATE)==1)
  110.      {
  111.       Print(查询合约(账号,Symbol()));
  112.       ObjectSetInteger(0,m_url+"查询合约",OBJPROP_STATE,0);
  113.      }
  114.    if(ObjectGetInteger(0,m_url+"查询市场深度",OBJPROP_STATE)==1)
  115.      {
  116.       Print(查询市场深度(账号,Symbol()));
  117.       ObjectSetInteger(0,m_url+"查询市场深度",OBJPROP_STATE,0);
  118.      }


  119. //+------------------------------------------------------------------+
  120. //|                 主动查询信息 每次需要查询最新的信息就要先提交这个需求,然后再去使用上面的查询
  121. //|                 这个接口是在期货CTP那边查询,不要频繁查询,防止被封号!!!
  122. //|                 这个接口是在期货CTP那边查询,不要频繁查询,防止被封号!!!
  123. //|                 这个接口是在期货CTP那边查询,不要频繁查询,防止被封号!!!
  124. //|                 重要的事情说三遍
  125. //+------------------------------------------------------------------+

  126.    Createbutton(m_url+"请求查询持仓汇总"," 请求 ...","请求",50+155,35+105+50,45,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  127.    Createbutton(m_url+"请求查询持仓明细"," 请求 ...","请求",50+155,35+105+50+50,45,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  128.    Createbutton(m_url+"请求查询资金明细"," 请求 ...","请求",50+155,35+105+50+100,45,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  129.    Createbutton(m_url+"请求查询合约"," 请求 ...","请求",50+155,35+105+50+100+50,45,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  130.    Createbutton(m_url+"请求查询市场深度"," 请求 ...","请求",50+155,35+105+50+100+100,45,28,CORNER_RIGHT_LOWER,clrAqua,clrNavy,10);
  131.    if(ObjectGetInteger(0,m_url+"请求查询持仓汇总",OBJPROP_STATE)==1)
  132.      {
  133.       Print(查询持仓汇总(账号,"-"));
  134.       ObjectSetInteger(0,m_url+"请求查询持仓汇总",OBJPROP_STATE,0);
  135.      }
  136.    if(ObjectGetInteger(0,m_url+"请求查询持仓明细",OBJPROP_STATE)==1)
  137.      {
  138.       Print(查询持仓明细(账号,"-"));
  139.       ObjectSetInteger(0,m_url+"请求查询持仓明细",OBJPROP_STATE,0);
  140.      }
  141.    if(ObjectGetInteger(0,m_url+"请求查询资金明细",OBJPROP_STATE)==1)
  142.      {
  143.       Print(查询资金明细(账号,"-"));
  144.       ObjectSetInteger(0,m_url+"请求查询资金明细",OBJPROP_STATE,0);
  145.      }
  146.    if(ObjectGetInteger(0,m_url+"请求查询合约",OBJPROP_STATE)==1)
  147.      {
  148.       Print(查询合约(账号,Symbol(),"-"));
  149.       ObjectSetInteger(0,m_url+"请求查询合约",OBJPROP_STATE,0);
  150.      }
  151.    if(ObjectGetInteger(0,m_url+"请求查询市场深度",OBJPROP_STATE)==1)
  152.      {
  153.       Print(查询市场深度(账号,Symbol(),"-"));
  154.       ObjectSetInteger(0,m_url+"请求查询市场深度",OBJPROP_STATE,0);
  155.      }


  156.   }
  157. //+------------------------------------------------------------------+
  158. //|                                                                  |
  159. //+------------------------------------------------------------------+
  160. int  OrderSend(string symbol,int  cmd,int volume,int account,double price=0)//价格0默认就涨跌停开单
  161.   {
  162.    string tmp=cmd==0?"buy":"sell";
  163.    if(price==0)
  164.       price=cmd==0?SymbolInfoDouble(symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX):SymbolInfoDouble(symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN);
  165.    string mtctp=url+"?mode="+"0";
  166.    mtctp=mtctp+"&symbol="+symbol;
  167.    mtctp=mtctp+"&type="+tmp;
  168.    mtctp=mtctp+"&lots="+IntegerToString(volume);
  169.    mtctp=mtctp+"&price="+DoubleToString(price,int(SymbolInfoInteger(symbol,SYMBOL_DIGITS)));
  170.    mtctp=mtctp+"&account="+string(account);
  171.    string cookie=NULL,headers;
  172.    char post[],result[];
  173.    int res;
  174.    ResetLastError();
  175.    int timeout=2000;
  176.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  177.    if(res==-1)
  178.      {
  179.       Print(account," ",__FUNCTION__,"失败:"+mtctp);
  180.      }
  181.    else
  182.      {
  183.       if(等待同步返回信息)
  184.          Print(Result(account,url+"?"+CharArrayToString(result,0,-1,CP_UTF8)));//打印同步等待的服务器处理结果
  185.       else
  186.          Print(account," ",__FUNCTION__,":"+CharArrayToString(result,0,-1,CP_UTF8)+">>"+mtctp);
  187.       return 1;
  188.      }
  189.    return 0;
  190.   }
  191. string jiemi(string in)
  192.   {
  193.    string keystr="ABCDEFG";
  194.    uchar src[],dst[],key[];
  195.    ArrayResize(dst,StringLen(in)*2);
  196.    StringToCharArray(keystr,key);
  197.    StringToCharArray(in,dst);
  198.    CryptDecode(CRYPT_BASE64,dst,key,src);
  199.    return  CharArrayToString(src);
  200.   }
  201. //+------------------------------------------------------------------+
  202. //|                                                                  |
  203. //+------------------------------------------------------------------+
  204. int  OrderClose(string symbol,int  cmd,int volume,int account,double price=0)//价格0默认就涨跌停平仓
  205.   {
  206.    string tmp=cmd==0?"closebuy":"closesell";
  207.    if(price==0)
  208.       price=cmd==0?SymbolInfoDouble(symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN):SymbolInfoDouble(symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX);
  209.    string mtctp=url+"?mode="+"0";
  210.    mtctp=mtctp+"&symbol="+symbol;
  211.    mtctp=mtctp+"&type="+tmp;
  212.    mtctp=mtctp+"&lots="+IntegerToString(volume);
  213.    mtctp=mtctp+"&price="+DoubleToString(price,int(SymbolInfoInteger(symbol,SYMBOL_DIGITS)));
  214.    mtctp=mtctp+"&account="+string(account);
  215.    string cookie=NULL,headers;
  216.    char post[],result[];
  217.    int res;
  218.    ResetLastError();
  219.    int timeout=2000;
  220.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);

  221.    if(res==-1)
  222.      {
  223.       Print(account," ",__FUNCTION__,"失败:"+mtctp);
  224.      }
  225.    else
  226.      {
  227.       if(等待同步返回信息)
  228.          Print(Result(account,url+"?"+CharArrayToString(result,0,-1,CP_UTF8)));//打印同步等待的服务器处理结果
  229.       else
  230.          Print(account," ",__FUNCTION__,":"+CharArrayToString(result,0,-1,CP_UTF8)+">>"+mtctp);
  231.       return 1;
  232.      }
  233.    return 0;
  234.   }


  235. //+------------------------------------------------------------------+
  236. //|                                                                  |
  237. //+------------------------------------------------------------------+
  238. string Result(int account,string _url)
  239.   {
  240.    Sleep(同步信息等待毫秒);
  241.    string cookie=NULL,headers;
  242.    char post[],result[];
  243.    int res;
  244.    ResetLastError();
  245.    int timeout=2000;
  246.    res=WebRequest("GET",_url,cookie,NULL,timeout,post,0,result,headers);
  247.    if(res==-1)
  248.      {
  249.       return "false";
  250.      }
  251.    else
  252.      {
  253.       return jiemi(CharArrayToString(result,0,-1,CP_UTF8))+">>"+_url;
  254.      }
  255.    return "";
  256.   }
  257. //+------------------------------------------------------------------+
  258. //|                                                                  |
  259. //+------------------------------------------------------------------+
  260. string   查询合约(int account,string symbol,string set="")
  261.   {
  262.    string mtctp=url+"?mode="+set+"5";
  263.    mtctp=mtctp+"&account="+string(account);
  264.    mtctp=mtctp+"&symbol="+symbol;
  265.    string cookie=NULL,headers;
  266.    char post[],result[];
  267.    int res;
  268.    ResetLastError();
  269.    int timeout=2000;

  270.    Print(mtctp);
  271.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  272.    if(res==-1)
  273.      {
  274.       Print(__FUNCTION__,"失败:"+mtctp);
  275.      }
  276.    else
  277.      {
  278.       return CharArrayToString(result,0,-1,CP_UTF8);
  279.      }
  280.    return "";
  281.   }
  282. //+------------------------------------------------------------------+
  283. //|                                                                  |
  284. //+------------------------------------------------------------------+
  285. string   查询市场深度(int account,string symbol,string set="")
  286.   {
  287.    string mtctp=url+"?mode="+set+"4";
  288.    mtctp=mtctp+"&account="+string(account);
  289.    mtctp=mtctp+"&symbol="+symbol;
  290.    string cookie=NULL,headers;
  291.    char post[],result[];
  292.    int res;
  293.    ResetLastError();
  294.    int timeout=2000;
  295.    Print(mtctp);
  296.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  297.    if(res==-1)
  298.      {
  299.       Print(__FUNCTION__,"失败:"+mtctp);
  300.      }
  301.    else
  302.      {
  303.       return CharArrayToString(result,0,-1,CP_UTF8);
  304.      }
  305.    return "";
  306.   }


  307. //+------------------------------------------------------------------+
  308. //|                                                                  |
  309. //+------------------------------------------------------------------+
  310. string   查询持仓汇总(int account,string set="")
  311.   {
  312.    string mtctp=url+"?mode="+set+"1";
  313.    mtctp=mtctp+"&account="+string(account);

  314.    string cookie=NULL,headers;
  315.    char post[],result[];
  316.    int res;
  317.    ResetLastError();
  318.    int timeout=2000;

  319.    Print(mtctp);
  320.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  321.    if(res==-1)
  322.      {
  323.       Print(__FUNCTION__,"失败:"+mtctp);
  324.      }
  325.    else
  326.      {
  327.       return CharArrayToString(result,0,-1,CP_UTF8);
  328.      }
  329.    return "";
  330.   }
  331. //+------------------------------------------------------------------+
  332. //|                                                                  |
  333. //+------------------------------------------------------------------+
  334. string   查询持仓明细(int account,string set="")
  335.   {
  336.    string mtctp=url+"?mode="+set+"2";
  337.    mtctp=mtctp+"&account="+string(account);

  338.    string cookie=NULL,headers;
  339.    char post[],result[];
  340.    int res;
  341.    ResetLastError();
  342.    int timeout=2000;

  343.    Print(mtctp);
  344.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  345.    if(res==-1)
  346.      {
  347.       Print(__FUNCTION__,"失败:"+mtctp);
  348.      }
  349.    else
  350.      {
  351.       return CharArrayToString(result,0,-1,CP_UTF8);
  352.      }
  353.    return "";
  354.   }
  355. //+------------------------------------------------------------------+
  356. //|                                                                  |
  357. //+------------------------------------------------------------------+
  358. string   查询资金明细(int account,string set="")
  359.   {
  360.    string mtctp=url+"?mode="+set+"3";
  361.    mtctp=mtctp+"&account="+string(account);

  362.    string cookie=NULL,headers;
  363.    char post[],result[];
  364.    int res;
  365.    ResetLastError();
  366.    int timeout=2000;

  367.    Print(mtctp);
  368.    res=WebRequest("GET",mtctp,cookie,NULL,timeout,post,0,result,headers);
  369.    if(res==-1)
  370.      {
  371.       Print(__FUNCTION__,"失败:"+mtctp);
  372.      }
  373.    else
  374.      {
  375.       return CharArrayToString(result,0,-1,CP_UTF8);
  376.      }
  377.    return "";
  378.   }

  379. //+------------------------------------------------------------------+
  380. void Createbutton(string name,string txt1,string txt2,int XX,int YX,int XL,int YL,int WZ,color A,color B,int size)
  381.   {
  382.    if(ObjectFind(0,name)==-1)
  383.       ObjectCreate(0,name,OBJ_BUTTON,0,0,0);

  384.    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,XX);
  385.    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,YX);
  386.    ObjectSetInteger(0,name,OBJPROP_XSIZE,XL);
  387.    ObjectSetInteger(0,name,OBJPROP_YSIZE,YL);
  388.    ObjectSetString(0,name,OBJPROP_FONT,"微软雅黑");
  389.    ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
  390.    ObjectSetInteger(0,name,OBJPROP_CORNER,WZ);
  391.    if(ObjectGetInteger(0,name,OBJPROP_STATE)==1)
  392.      {
  393.       ObjectSetInteger(0,name,OBJPROP_COLOR,A);
  394.       ObjectSetInteger(0,name,OBJPROP_BGCOLOR,B);
  395.       ObjectSetString(0,name,OBJPROP_TEXT,txt1);
  396.      }
  397.    else
  398.      {
  399.       ObjectSetInteger(0,name,OBJPROP_COLOR,B);
  400.       ObjectSetInteger(0,name,OBJPROP_BGCOLOR,A);
  401.       ObjectSetString(0,name,OBJPROP_TEXT,txt2);
  402.      }
  403.   }
  404. string m_url="mtctp";
  405. //+------------------------------------------------------------------+
  406. //| Expert tick function                                             |
  407. //+------------------------------------------------------------------+

  408. //+------------------------------------------------------------------+
  409. void OnTimer()
  410.   {
  411.    OnTick();
  412.   }
  413. //+------------------------------------------------------------------+
复制代码




下面这些文件都要下载放到同一个文件夹里面     比如随便建立一个CTP文件夹来放这些文件
运行的时候就运行EXE文件
JSON里面是设置账号密码的。
不想打包成压缩文件了。嫌麻烦







Accountlogin.json

545 Bytes, 下载次数: 10258

JSON登录文件

thostmduserapi_se.dll

2.09 MB, 下载次数: 10262

必备DLL

thosttraderapi_se.dll

2.38 MB, 下载次数: 10260

必备DLL

mfchttp.exe

12.14 MB, 下载次数: 10359

期货服务端文件

QQ|Archiver|小黑屋|www.mtctp.com |

GMT+8, 2025-4-3 12:33 , Processed in 0.052187 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表