交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
广告位
查看: 4491|回复: 1

[跟单] 本地和远程跟单端口

[复制链接]

29

主题

1223

积分

1

精华

初级操盘手

金钱
1223 美元
权重
14
发表于 2014-3-10 17:31 | 显示全部楼层 |阅读模式
原理大致是,主账号的新单子,会自动写入比如D:\下的某个文件,跟单账号会读取这个文件,然后给自己的账号下单。
·指标可以做本地跟单和远程跟单用
远程跟单的原理,主要是需要在电脑本地安装网盘软件,让多个网盘账号间共享文件夹的形式完成的,还没具体测试。。。而且电脑里外装一个网盘软件有点不放心。
·打开代码,据观察,引入了系统的如下函数命令
#import "kernel32.dll"
   int CopyFileA(string a0, string a1, int a2);
理论上,只要可以引入dll,则dll可以做任何事情。
在这里的代码中,只引入了CopyFileA这个命令(复制文件用)
查看了有CopyFileA的代码,没有发现窃取个人信息用的部分,是安全的。
·指标可以做本地跟单和远程跟单用
远程跟单的原理,主要是需要在电脑本地安装网盘软件,让多个网盘账号间共享文件夹的形式完成的,还没具体测试。。。而且电脑里外装一个网盘软件有点不放心。
·极速模式可以使跟单速度非常快,但是如果开的平台数量很多容易卡。。。占用CPU过多。
发射端代码:

  1. #import "kernel32.dll"
  2.    int CopyFileA(string a0, string a1, int a2);
  3. string 中转文件名="";
  4. extern string 中转路径="D:";  
  5. extern bool 修正货币对名称=false;  
  6. extern bool 极速模式=true;
  7. int init()
  8.   {
  9.   中转文件名=DoubleToStr(AccountNumber(),0);
  10.      if(IsDllsAllowed()==false)
  11.      Alert("请允许调用动态链接库");
  12.    return(0);
  13.   }
  14. int deinit()
  15.   {
  16. Comment("");
  17.    return(0);
  18.   }
  19. int start()
  20.   {
  21.   if(IsDllsAllowed()==false)
  22.   return(0);
  23.   
  24.   Comment("----------已开启跟单------------");
  25.   
  26. while (!IsStopped() && IsExpertEnabled())
  27. {
  28.   int handle;
  29.   handle=FileOpen(中转文件名+".csv", FILE_CSV|FILE_WRITE, ';');
  30.   if(handle>0)
  31.     {
  32.         for(int i=0;i<OrdersTotal();i++)
  33.         if(OrderSelect(i,SELECT_BY_POS))
  34.         {
  35.            string name=OrderSymbol();
  36.            
  37.            if(修正货币对名称)
  38.            name=StringSubstr(OrderSymbol(),0,6);
  39.            
  40.            if(修正货币对名称)
  41.            if(StringFind(name,"GOLD",0)==0)
  42.            name="GOLD";           
  43.            
  44.            FileWrite(handle,OrderTicket(),name,OrderType(),OrderLots(),OrderStopLoss(),OrderTakeProfit(),OrderComment(),OrderMagicNumber(),OrderOpenTime(),OrderOpenPrice());
  45.         }
  46.     FileClose(handle);  
  47.     }
  48.   handle=FileOpen(中转文件名+"2.csv", FILE_CSV|FILE_WRITE, ';');
  49.   if(handle>0)
  50.     {
  51.         for(i=0;i<OrdersHistoryTotal();i++)
  52.         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  53.         if(OrderType()<6)
  54.         {
  55.         FileWrite(handle,OrderTicket(),OrderSymbol(),OrderType(),OrderLots(),OrderStopLoss(),OrderTakeProfit(),OrderComment(),OrderMagicNumber(),OrderOpenTime(),OrderOpenPrice());
  56.         }
  57.     FileClose(handle);  
  58.     }

  59.    string 发射端发射位置= 中转路径+"\"+中转文件名+".csv";  
  60.    string 发射端保存位置= TerminalPath() + "\\Experts\\Files\" +中转文件名+".csv";
  61.    int t=CopyFileA(发射端保存位置,发射端发射位置,0);  
  62.     发射端发射位置= 中转路径+"\"+中转文件名+"2.csv";  
  63.     发射端保存位置= TerminalPath() + "\\Experts\\Files\" +中转文件名+"2.csv";
  64.     t=CopyFileA(发射端保存位置,发射端发射位置,0);  
  65.    
  66.    if(t==-1)
  67.    Alert("发射端发送数据失败");
  68.    
  69.    if(极速模式==false)
  70.    return(0);
  71. }   
  72.    return(0);
  73.   }
  74. //+------------------------------------------------------------------+
复制代码

接收端代码:

  1. #import "kernel32.dll"
  2.    int CopyFileA(string a0, string a1, int a2);
  3. extern bool 是否显示文字标签=true;
  4. extern string 跟踪主账号="";
  5. extern string 中转路径="D:";
  6. extern int 跟单允许秒误差=30000000;
  7. extern double 跟单允许点误差=1000;
  8. extern bool 跟踪止损止盈=true;
  9. extern bool 反向跟单=false;
  10. extern bool 跟踪挂单=true;
  11. extern double 单量比例=1;
  12. extern string 货币对名称附加="";
  13. extern string comm1="---------个别货币对无法正常跟单时使用------------";
  14. extern bool 货币对名称强制修正开关=false;
  15. extern string 所跟货币对名称="XAUUSD";
  16. extern string 下单货币对名称="GOLD";
  17. extern string comm2="---------------------";
  18. extern double 跟主账户单量大于等于N单子=0;
  19. extern bool 极速模式=true;
  20. int        OrderTicketX[10000];
  21. string     OrderSymbolX[10000];
  22. int        OrderTypeX[10000];
  23. double     OrderLotsX[10000];
  24. double     OrderStopLossX[10000];
  25. double     OrderTakeProfitX[10000];
  26. string     OrderCommentX[10000];
  27. int        OrderMagicNumberX[10000];
  28. datetime   OrderOpenTimeX[10000];
  29. double     OrderOpenPriceX[10000];
  30. int        OrderTicketXH[10000];
  31. string     OrderSymbolXH[10000];
  32. int        OrderTypeXH[10000];
  33. double     OrderLotsXH[10000];
  34. double     OrderStopLossXH[10000];
  35. double     OrderTakeProfitXH[10000];
  36. string     OrderCommentXH[10000];
  37. int        OrderMagicNumberXH[10000];
  38. datetime   OrderOpenTimeXH[10000];
  39. double     OrderOpenPriceXH[10000];
  40. double 滑点=100;  
  41. //===========================================================================
  42. int init()
  43.   {
  44.   
  45.      if(IsDllsAllowed()==false)
  46.      Alert("请允许调用动态链接库");
  47.    return(0);
  48.   }
  49. //===========================================================================
  50. int deinit()
  51.   {
  52.    return(0);
  53.   }
  54. //===========================================================================
  55. int start()
  56.   {
  57.   if(IsTradeAllowed()==false)
  58.   {
  59.   Comment("           不允许智能交易");
  60.   return(0);
  61.   }
  62.   if(IsDllsAllowed()==false)
  63.   return(0);
  64.   while (!IsStopped() && IsExpertEnabled())
  65.   {
  66.   提取信号();
  67.   跟踪市价单();
  68.   提取历史信号();
  69.   
  70.   
  71.   修改订单止损止盈();
  72.   
  73.   平单();
  74. Comment(
  75.   "\n历史0:"+OrderTicketXH[0]+" "+OrderSymbolXH[0]+" "+OrderTypeXH[0]+" "+OrderLotsXH[0]+
  76.   "\n历史1:"+OrderTicketXH[1]+" "+OrderSymbolXH[1]+" "+OrderTypeXH[1]+" "+OrderLotsXH[1]+
  77.   "\n历史2:"+OrderTicketXH[2]+" "+OrderSymbolXH[2]+" "+OrderTypeXH[2]+" "+OrderLotsXH[2]+
  78.   "\n历史3:"+OrderTicketXH[3]+" "+OrderSymbolXH[3]+" "+OrderTypeXH[3]+" "+OrderLotsXH[3]+
  79.   "\n历史4:"+OrderTicketXH[4]+" "+OrderSymbolXH[4]+" "+OrderTypeXH[4]+" "+OrderLotsXH[4]+
  80.   "\n历史5:"+OrderTicketXH[5]+" "+OrderSymbolXH[5]+" "+OrderTypeXH[5]+" "+OrderLotsXH[5]+
  81.   "\n历史6:"+OrderTicketXH[6]+" "+OrderSymbolXH[6]+" "+OrderTypeXH[6]+" "+OrderLotsXH[6]+
  82.   "\n"+
  83.   "\n持有0:"+OrderTicketX[0]+" "+OrderSymbolX[0]+" "+OrderTypeX[0]+" "+OrderLotsX[0]+" 对应"+已跟单对应记录(OrderTicketX[0])+
  84.   "\n持有1:"+OrderTicketX[1]+" "+OrderSymbolX[1]+" "+OrderTypeX[1]+" "+OrderLotsX[1]+" 对应"+已跟单对应记录(OrderTicketX[1])+
  85.   "\n持有2:"+OrderTicketX[2]+" "+OrderSymbolX[2]+" "+OrderTypeX[2]+" "+OrderLotsX[2]+" 对应"+已跟单对应记录(OrderTicketX[2])+
  86.   "\n持有3:"+OrderTicketX[3]+" "+OrderSymbolX[3]+" "+OrderTypeX[3]+" "+OrderLotsX[3]+" 对应"+已跟单对应记录(OrderTicketX[3])+
  87.   "\n持有4:"+OrderTicketX[4]+" "+OrderSymbolX[4]+" "+OrderTypeX[4]+" "+OrderLotsX[4]+" 对应"+已跟单对应记录(OrderTicketX[4])+
  88.   "\n持有5:"+OrderTicketX[5]+" "+OrderSymbolX[5]+" "+OrderTypeX[5]+" "+OrderLotsX[5]+" 对应"+已跟单对应记录(OrderTicketX[5])+
  89.   "\n持有6:"+OrderTicketX[6]+" "+OrderSymbolX[6]+" "+OrderTypeX[6]+" "+OrderLotsX[6]+" 对应"+已跟单对应记录(OrderTicketX[6])
  90.   );
  91.   
  92.    if(极速模式==false)
  93.    return(0);  
  94.   
  95.   }
  96.    return(0);
  97.   }
  98. //+------------------------------------------------------------------+
  99. void 平单()
  100. {
  101.       for(int i2=0;i2<1000;i2++)
  102.       if(OrderTicketXH[i2]!=0)
  103.       if(OrderSelect(findlassorder(-100,-1,"后","现在",OrderTicketXH[i2]),SELECT_BY_TICKET))
  104.       if(OrderCloseTime()==0)
  105.       {
  106.       
  107.          {
  108.             if(OrderType()>1)
  109.             OrderDelete(OrderTicket());
  110.             else
  111.             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),滑点);
  112.          }
  113.       }
  114. }
  115. int 已跟单对应记录(int ti)
  116. {
  117.    if(ti==0)
  118.    return(-1);
  119. return(findlassorder(-100,-1,"后","现在",ti)+findlassorder(-100,-1,"后","历史",ti)+1);
  120. }
  121. int findlassorder(int type,int magic,string fx,string 现在与历史,string comm)
  122. {
  123.    if(现在与历史=="现在")
  124.    if(fx=="后")
  125.    for(int i=OrdersTotal()-1;i>=0;i--)
  126.    {
  127.       if(OrderSelect(i,SELECT_BY_POS))
  128.       //if(Symbol()==OrderSymbol())
  129.       if(OrderMagicNumber()==magic||magic==-1)
  130.       if(OrderType()==type||type==-100)
  131.       if(StringFind(OrderComment(),comm,0)!=-1||comm=="")
  132.       return(OrderTicket());
  133.    }
  134.    if(现在与历史=="现在")
  135.    if(fx=="前")
  136.    for(i=0;i<OrdersTotal();i++)
  137.    {
  138.       if(OrderSelect(i,SELECT_BY_POS))
  139.       //if(Symbol()==OrderSymbol())
  140.       if(OrderMagicNumber()==magic||magic==-1)
  141.       if(OrderType()==type||type==-100)
  142.       if(StringFind(OrderComment(),comm,0)!=-1||comm=="")
  143.       return(OrderTicket());
  144.    }
  145.    
  146.    if(现在与历史=="历史")
  147.    if(fx=="后")
  148.    for(i=OrdersHistoryTotal()-1;i>=0;i--)
  149.    {
  150.       if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  151.       //if(Symbol()==OrderSymbol())
  152.       if(OrderMagicNumber()==magic||magic==-1)
  153.       if(OrderType()==type||(type==-100&&OrderType()<=5&&OrderType()>=0))
  154.       if(StringFind(OrderComment(),comm,0)!=-1||comm=="")
  155.       if(OrderCloseTime()!=0)
  156.       return(OrderTicket());
  157.    }
  158.    if(现在与历史=="历史")
  159.    if(fx=="前")
  160.    for(i=0;i<OrdersHistoryTotal();i++)
  161.    {
  162.       if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  163.       //if(Symbol()==OrderSymbol())
  164.       if(OrderMagicNumber()==magic||magic==-1)
  165.       if(OrderType()==type||(type==-100&&OrderType()<=5&&OrderType()>=0))
  166.       if(StringFind(OrderComment(),comm,0)!=-1||comm=="")
  167.       if(OrderCloseTime()!=0)
  168.       return(OrderTicket());
  169.    }
  170. return(-1);
  171. }
  172. void 修改订单止损止盈()
  173. {
  174.    if(跟踪挂单)
  175.    for(int i=0;i<10000;i++)
  176.    if(OrderSelect(已跟单对应记录(OrderTicketX[i]),SELECT_BY_TICKET))
  177.    if(OrderType()>1)
  178.    if(OrderOpenPrice()!=OrderOpenPriceX[i])
  179.    {
  180.    
  181.       OrderModify(OrderTicket(),OrderOpenPriceX[i],OrderStopLoss(),OrderTakeProfit(),0);      
  182.    }
  183.    if(跟踪止损止盈)
  184.    for(i=0;i<10000;i++)
  185.    if(OrderSelect(已跟单对应记录(OrderTicketX[i]),SELECT_BY_TICKET))
  186.    {
  187.    
  188.       if(反向跟单==false)
  189.       if(!(OrderStopLoss()==OrderStopLossX[i]&&OrderTakeProfit()==OrderTakeProfitX[i]))
  190.       OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLossX[i],OrderTakeProfitX[i],0);
  191.       if(反向跟单)
  192.       if(!(OrderTakeProfit()==OrderStopLossX[i]&&OrderStopLoss()==OrderTakeProfitX[i]))
  193.       OrderModify(OrderTicket(),OrderOpenPrice(),OrderTakeProfitX[i],OrderStopLossX[i],0);        
  194.    }  
  195. }
  196. //===========================================================================
  197. void 跟踪市价单()
  198. {
  199.    for(int i=0;i<10000;i++)
  200.    if(OrderSymbolX[i]!=""&&OrderTicketX[i]!=0)
  201.    if(OrderTypeX[i]<2||跟踪挂单)
  202.    if(TimeCurrent()-OrderOpenTimeX[i]<=跟单允许秒误差)
  203.    if((OrderTypeX[i]==0&&MathAbs(MarketInfo(OrderSymbolX[i],MODE_ASK)-OrderOpenPriceX[i])<=跟单允许点误差*MarketInfo(OrderSymbolX[i],MODE_POINT)*系数())
  204.      ||(OrderTypeX[i]==1&&MathAbs(MarketInfo(OrderSymbolX[i],MODE_BID)-OrderOpenPriceX[i])<=跟单允许点误差*MarketInfo(OrderSymbolX[i],MODE_POINT)*系数())||跟踪挂单)
  205.    if(已跟单对应记录(OrderTicketX[i])==-1)
  206.    if(OrderLotsX[i]>=跟主账户单量大于等于N单子)
  207.    {
  208.    
  209.       if(OrderTypeX[i]<2)
  210.       {
  211.          if(反向跟单==false)
  212.          int t=建立单据(OrderSymbolX[i],OrderTypeX[i],OrderLotsX[i]*单量比例,0,0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  213.          else
  214.          t=建立单据(OrderSymbolX[i],MathAbs(OrderTypeX[i]-1),OrderLotsX[i]*单量比例,0,0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  215.       }
  216.       
  217.       if(跟踪挂单)
  218.       {
  219.          if(OrderTypeX[i]==OP_BUYLIMIT)
  220.          {
  221.             if(反向跟单==false)
  222.             t=建立单据(OrderSymbolX[i],OP_BUYLIMIT,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  223.             else
  224.             t=建立单据(OrderSymbolX[i],OP_SELLSTOP,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);      
  225.          }
  226.          if(OrderTypeX[i]==OP_BUYSTOP)
  227.          {
  228.             if(反向跟单==false)
  229.             t=建立单据(OrderSymbolX[i],OP_BUYSTOP,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  230.             else
  231.             t=建立单据(OrderSymbolX[i],OP_SELLLIMIT,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);      
  232.          }
  233.          if(OrderTypeX[i]==OP_SELLLIMIT)
  234.          {
  235.             if(反向跟单==false)
  236.             t=建立单据(OrderSymbolX[i],OP_SELLLIMIT,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  237.             else
  238.             t=建立单据(OrderSymbolX[i],OP_BUYSTOP,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);      
  239.          }
  240.          if(OrderTypeX[i]==OP_SELLSTOP)
  241.          {
  242.             if(反向跟单==false)
  243.             t=建立单据(OrderSymbolX[i],OP_SELLSTOP,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);
  244.             else
  245.             t=建立单据(OrderSymbolX[i],OP_BUYLIMIT,OrderLotsX[i]*单量比例,OrderOpenPriceX[i],0,0,0,OrderTicketX[i],OrderMagicNumberX[i]);      
  246.          }
  247.       }               
  248.    报错组件("建立跟单");
  249.    }
  250.    

  251. }
  252. //===========================================================================
  253. void 提取历史信号()
  254. {
  255.    string 接收端提取位置= 中转路径+"\"+跟踪主账号 +"2.csv";
  256.    string 接收端保存位置= TerminalPath() + "\\Experts\\Files\" +跟踪主账号 +"2.csv";
  257.    int t=CopyFileA(接收端提取位置,接收端保存位置,0);  
  258.   int handle;
  259.   handle=FileOpen(跟踪主账号 +"2.csv", FILE_CSV|FILE_READ, ';');   
  260.   if(handle>0)
  261.     {
  262.         for(int i=0;i<10000;i++)
  263.         {
  264.         OrderTicketXH[i]=     StrToInteger(FileReadString(handle));
  265.         string namexx=FileReadString(handle);
  266.         OrderSymbolXH[i]=namexx+货币对名称附加;
  267.            if(StringFind(namexx,"XAUUSD",0)!=-1||StringFind(namexx,"GOLD",0)!=-1)
  268.            if(iClose(OrderSymbolXH[i],0,0)==0||iClose(OrderSymbolXH[i],0,0)==-1||iClose(OrderSymbolXH[i],0,0)==EMPTY_VALUE)
  269.            {
  270.            string NEWNAME="XAUUSD"+货币对名称附加;
  271.               if(!(iClose(NEWNAME,0,0)==0||iClose(NEWNAME,0,0)==-1||iClose(NEWNAME,0,0)==EMPTY_VALUE))
  272.               OrderSymbolXH[i]=NEWNAME;
  273.            NEWNAME="GOLD"+货币对名称附加;
  274.               if(!(iClose(NEWNAME,0,0)==0||iClose(NEWNAME,0,0)==-1||iClose(NEWNAME,0,0)==EMPTY_VALUE))
  275.               OrderSymbolXH[i]=NEWNAME;              
  276.            }
  277.            
  278.            if(货币对名称强制修正开关)
  279.            if(namexx==所跟货币对名称)
  280.            OrderSymbolXH[i]=下单货币对名称;
  281.            
  282.         OrderTypeXH[i]=       StrToInteger(FileReadString(handle));
  283.         OrderLotsXH[i]=       StrToDouble(FileReadString(handle));
  284.            if(OrderTicketXH[i]!=0)
  285.            if(OrderTypeXH[i]<6)
  286.            {
  287.            OrderStopLossXH[i]=   NormalizeDouble(StrToDouble(FileReadString(handle)),MarketInfo(OrderSymbolXH[i],MODE_DIGITS));
  288.            OrderTakeProfitXH[i]= NormalizeDouble(StrToDouble(FileReadString(handle)),MarketInfo(OrderSymbolXH[i],MODE_DIGITS));
  289.            }
  290.         OrderCommentXH[i]=    FileReadString(handle);
  291.         OrderMagicNumberXH[i]=StrToInteger(FileReadString(handle));
  292.         OrderOpenTimeXH[i]=   StrToInteger(FileReadString(handle));
  293.         OrderOpenPriceXH[i]=  StrToDouble(FileReadString(handle));
  294.            if(FileIsEnding(handle))
  295.            break;
  296.         }
  297.     FileClose(handle);  
  298.     }
  299. }  
  300. //===========================================================================
  301. void 提取信号()
  302. {
  303.    string 接收端提取位置= 中转路径+"\"+跟踪主账号 +".csv";  
  304.    string 接收端保存位置= TerminalPath() + "\\Experts\\Files\" +跟踪主账号 +".csv";
  305.    int t=CopyFileA(接收端提取位置,接收端保存位置,0);  
  306.   int handle;
  307.   handle=FileOpen(跟踪主账号 +".csv", FILE_CSV|FILE_READ, ';');   
  308.   if(handle>0)
  309.     {
  310.     ArrayInitialize(OrderTicketX,0);
  311.     ArrayInitialize(OrderTypeX,0);
  312.     ArrayInitialize(OrderLotsX,0);
  313.     ArrayInitializeX(OrderSymbolX,"",10000);
  314.         for(int i=0;i<10000;i++)
  315.         {
  316.         OrderTicketX[i]=     StrToInteger(FileReadString(handle));
  317.         string namexx=FileReadString(handle);
  318.         OrderSymbolX[i]=namexx+货币对名称附加;
  319.            
  320.            if(StringFind(namexx,"XAUUSD",0)!=-1||StringFind(namexx,"GOLD",0)!=-1)
  321.            if(iClose(OrderSymbolX[i],0,0)==0||iClose(OrderSymbolX[i],0,0)==-1||iClose(OrderSymbolX[i],0,0)==EMPTY_VALUE)
  322.            {
  323.            string NEWNAME="XAUUSD"+货币对名称附加;
  324.               if(!(iClose(NEWNAME,0,0)==0||iClose(NEWNAME,0,0)==-1||iClose(NEWNAME,0,0)==EMPTY_VALUE))
  325.               OrderSymbolX[i]=NEWNAME;
  326.            NEWNAME="GOLD"+货币对名称附加;
  327.               if(!(iClose(NEWNAME,0,0)==0||iClose(NEWNAME,0,0)==-1||iClose(NEWNAME,0,0)==EMPTY_VALUE))
  328.               OrderSymbolX[i]=NEWNAME;              
  329.            }   
  330.            
  331.            if(货币对名称强制修正开关)
  332.            if(namexx==所跟货币对名称)
  333.            OrderSymbolX[i]=下单货币对名称;            
  334.                
  335.         OrderTypeX[i]=       StrToInteger(FileReadString(handle));
  336.         OrderLotsX[i]=       StrToDouble(FileReadString(handle));
  337.         
  338.            if(OrderTicketX[i]!=0)
  339.            if(OrderTypeX[i]<6)
  340.            {      
  341.            OrderStopLossX[i]=   NormalizeDouble(StrToDouble(FileReadString(handle)),MarketInfo(OrderSymbolX[i],MODE_DIGITS));
  342.            OrderTakeProfitX[i]= NormalizeDouble(StrToDouble(FileReadString(handle)),MarketInfo(OrderSymbolX[i],MODE_DIGITS));
  343.            }
  344.         OrderCommentX[i]=    FileReadString(handle);
  345.         OrderMagicNumberX[i]=StrToInteger(FileReadString(handle));
  346.         OrderOpenTimeX[i]=   StrToInteger(FileReadString(handle));
  347.         OrderOpenPriceX[i]=  StrToDouble(FileReadString(handle));
  348.            if(FileIsEnding(handle))
  349.            break;
  350.         }
  351.     FileClose(handle);  
  352.     }
  353. }
  354. //===========================================================================
  355. void ArrayInitializeX(string& A[],string b,int c)
  356. {
  357.    for(int i=0;i<c;i++)
  358.    A[i]=b;
  359. }
  360. double 系数()
  361. {
  362.    int 系数=1;
  363.    if(Digits==3||Digits==5||(StringFind(Symbol(),"XAU",0)==0&&Digits==2)||(StringFind(Symbol(),"GOLD",0)==0&&Digits==2))系数=10;
  364.    if(StringFind(Symbol(),"XAU",0)==0&&Digits==3)系数=100;  
  365. return(系数);
  366. }
  367. void laber(string a,color b)
  368. {
  369.    if(是否显示文字标签==true)
  370.    {
  371.    ObjectDelete("箭头"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)+a);
  372.    ObjectCreate("箭头"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)+a,OBJ_TEXT,0,Time[0],Low[0]);
  373.    ObjectSetText("箭头"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)+a,a,8,"Times New Roman",b);
  374.    }
  375. }
  376. int 建立单据(string 货币对,int 类型,double 单量,double 价位,double 间隔,double 止损,double 止盈,string 备注,int magic)
  377. {
  378.    if(MarketInfo(货币对,MODE_LOTSTEP)<10)int 单量小数保留X=0;
  379.    if(MarketInfo(货币对,MODE_LOTSTEP)<1)单量小数保留X=1;
  380.    if(MarketInfo(货币对,MODE_LOTSTEP)<0.1)单量小数保留X=2;
  381.    单量=NormalizeDouble(单量,单量小数保留X);
  382.    if(单量<MarketInfo(货币对,MODE_MINLOT))
  383.    {
  384.    laber("低于最低单量",Yellow);
  385.    return(-1);
  386.    }
  387.   
  388.    if(单量>MarketInfo(货币对,MODE_MAXLOT))
  389.    单量=MarketInfo(货币对,MODE_MAXLOT);
  390.    int t;
  391.    int i;
  392.    double zs,zy;
  393.    double POINT=MarketInfo(货币对,MODE_POINT)*系数();
  394.    int DIGITS=MarketInfo(货币对,MODE_DIGITS);
  395.    int 滑点2=滑点*系数();
  396.    价位=NormalizeDouble(价位,MarketInfo(货币对,MODE_DIGITS));
  397.    if(类型==OP_BUY)
  398.    {
  399.       RefreshRates();
  400.       t=OrderSend(货币对,OP_BUY,单量,MarketInfo(货币对,MODE_ASK),滑点2,0,0,备注,magic,0);
  401.       报错组件("");  
  402.       if(OrderSelect(t,SELECT_BY_TICKET))
  403.       {
  404.          if(止损!=0&&止盈!=0)
  405.          OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-止损*POINT,DIGITS),NormalizeDouble(OrderOpenPrice()+止盈*POINT,DIGITS),0);
  406.          if(止损==0&&止盈!=0)
  407.          OrderModify(OrderTicket(),OrderOpenPrice(),0,NormalizeDouble(OrderOpenPrice()+止盈*POINT,DIGITS),0);
  408.          if(止损!=0&&止盈==0)
  409.          OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-止损*POINT,DIGITS),0,0);
  410.          
  411.          报错组件("");
  412.       }
  413.    }
  414.    if(类型==OP_SELL)
  415.    {
  416.       RefreshRates();
  417.       t=OrderSend(货币对,OP_SELL,单量,MarketInfo(货币对,MODE_BID),滑点2,0,0,备注,magic,0);
  418.       报错组件("");  
  419.       if(OrderSelect(t,SELECT_BY_TICKET))
  420.       {
  421.          if(止损!=0&&止盈!=0)
  422.          OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+止损*POINT,DIGITS),NormalizeDouble(OrderOpenPrice()-止盈*POINT,DIGITS),0);
  423.          if(止损==0&&止盈!=0)
  424.          OrderModify(OrderTicket(),OrderOpenPrice(),0,NormalizeDouble(OrderOpenPrice()-止盈*POINT,DIGITS),0);
  425.          if(止损!=0&&止盈==0)
  426.          OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+止损*POINT,DIGITS),0,0);
  427.       }
  428.       报错组件("");
  429.    }
  430.    if(类型==OP_BUYLIMIT||类型==OP_BUYSTOP)
  431.    {
  432.       if(价位==0)
  433.       {
  434.       RefreshRates();
  435.       价位=MarketInfo(货币对,MODE_ASK);
  436.       }   
  437.       if(类型==OP_BUYLIMIT)
  438.          {
  439.             if(止损!=0&&止盈!=0)
  440.             t=OrderSend(货币对,OP_BUYLIMIT,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位-间隔*POINT-止损*POINT,DIGITS),NormalizeDouble(价位-间隔*POINT+止盈*POINT,DIGITS),备注,magic,0);
  441.             if(止损==0&&止盈!=0)
  442.             t=OrderSend(货币对,OP_BUYLIMIT,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,0,NormalizeDouble(价位-间隔*POINT+止盈*POINT,DIGITS),备注,magic,0);
  443.             if(止损!=0&&止盈==0)
  444.             t=OrderSend(货币对,OP_BUYLIMIT,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位-间隔*POINT-止损*POINT,DIGITS),0,备注,magic,0);
  445.             if(止损==0&&止盈==0)
  446.             t=OrderSend(货币对,OP_BUYLIMIT,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,0,0,备注,magic,0);            
  447.          }     
  448.       
  449.       if(类型==OP_BUYSTOP)
  450.          {
  451.             if(止损!=0&&止盈!=0)
  452.             t=OrderSend(货币对,OP_BUYSTOP,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位+间隔*POINT-止损*POINT,DIGITS),NormalizeDouble(价位+间隔*POINT+止盈*POINT,DIGITS),备注,magic,0);
  453.             if(止损==0&&止盈!=0)
  454.             t=OrderSend(货币对,OP_BUYSTOP,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,0,NormalizeDouble(价位+间隔*POINT+止盈*POINT,DIGITS),备注,magic,0);
  455.             if(止损!=0&&止盈==0)
  456.             t=OrderSend(货币对,OP_BUYSTOP,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位+间隔*POINT-止损*POINT,DIGITS),0,备注,magic,0);
  457.             if(止损==0&&止盈==0)
  458.             t=OrderSend(货币对,OP_BUYSTOP,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,0,0,备注,magic,0);            
  459.          }
  460.       报错组件("");
  461.    }   
  462.    if(类型==OP_SELLLIMIT||类型==OP_SELLSTOP)
  463.    {
  464.       if(价位==0)
  465.       {
  466.       RefreshRates();
  467.       价位=MarketInfo(货币对,MODE_BID);
  468.       }
  469.       if(类型==OP_SELLSTOP)
  470.          {
  471.             if(止损!=0&&止盈!=0)
  472.             t=OrderSend(货币对,OP_SELLSTOP,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位-间隔*POINT+止损*POINT,DIGITS),NormalizeDouble(价位-间隔*POINT-止盈*POINT,DIGITS),备注,magic,0);
  473.             if(止损==0&&止盈!=0)
  474.             t=OrderSend(货币对,OP_SELLSTOP,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,0,NormalizeDouble(价位-间隔*POINT-止盈*POINT,DIGITS),备注,magic,0);
  475.             if(止损!=0&&止盈==0)
  476.             t=OrderSend(货币对,OP_SELLSTOP,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位-间隔*POINT+止损*POINT,DIGITS),0,备注,magic,0);
  477.             if(止损==0&&止盈==0)
  478.             t=OrderSend(货币对,OP_SELLSTOP,单量,NormalizeDouble(价位-间隔*POINT,DIGITS),滑点2,0,0,备注,magic,0);
  479.          }     
  480.       
  481.       if(类型==OP_SELLLIMIT)
  482.          {
  483.             if(止损!=0&&止盈!=0)
  484.             t=OrderSend(货币对,OP_SELLLIMIT,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位+间隔*POINT+止损*POINT,DIGITS),NormalizeDouble(价位+间隔*POINT-止盈*POINT,DIGITS),备注,magic,0);
  485.             if(止损==0&&止盈!=0)
  486.             t=OrderSend(货币对,OP_SELLLIMIT,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,0,NormalizeDouble(价位+间隔*POINT-止盈*POINT,DIGITS),备注,magic,0);
  487.             if(止损!=0&&止盈==0)
  488.             t=OrderSend(货币对,OP_SELLLIMIT,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,NormalizeDouble(价位+间隔*POINT+止损*POINT,DIGITS),0,备注,magic,0);
  489.             if(止损==0&&止盈==0)
  490.             t=OrderSend(货币对,OP_SELLLIMIT,单量,NormalizeDouble(价位+间隔*POINT,DIGITS),滑点2,0,0,备注,magic,0);
  491.          }
  492.       报错组件("");
  493.    }   
  494. return(t);
  495. }
  496. //--------------------------------------
  497. //------------------------------------
  498. void 报错组件(string a)
  499. {
  500. Sleep(100);
  501. int t=GetLastError();
  502. string 报警;
  503.    if(t!=0)
  504.    switch (t)
  505.    {
  506.    case 0:报警="错误代码:"+0+"没有错误返回";break;
  507.    case 1:报警="错误代码:"+1+"没有错误返回但结果不明";break;
  508.    case 2:报警="错误代码:"+2+"一般错误";break;
  509.    case 3:报警="错误代码:"+3+"无效交易参量";break;
  510.    case 4:报警="错误代码:"+4+"交易服务器繁忙";break;
  511.    case 5:报警="错误代码:"+5+"客户终端旧版本";break;
  512.    case 6:报警="错误代码:"+6+"没有连接服务器";break;
  513.    case 7:报警="错误代码:"+7+"没有权限";break;
  514.    case 8:报警="错误代码:"+8+"请求过于频繁";break;
  515.    case 9:报警="错误代码:"+9+"交易运行故障";break;
  516.    case 64:报警="错误代码:"+64+"账户禁止";break;
  517.    case 65:报警="错误代码:"+65+"无效账户";break;
  518.    case 128:报警="错误代码:"+128+"交易超时";break;
  519.    case 129:报警="错误代码:"+129+"无效价格";break;
  520.    case 130:报警="错误代码:"+130+"无效停止";break;
  521.    case 131:报警="错误代码:"+131+"无效交易量";break;
  522.    case 132:报警="错误代码:"+132+"市场关闭";break;
  523.    case 133:报警="错误代码:"+133+"交易被禁止";break;
  524.    case 134:报警="错误代码:"+134+"资金不足";break;
  525.    case 135:报警="错误代码:"+135+"价格改变";break;
  526.    case 136:报警="错误代码:"+136+"开价";break;
  527.    case 137:报警="错误代码:"+137+"经纪繁忙";break;
  528.    case 138:报警="错误代码:"+138+"重新开价";break;
  529.    case 139:报警="错误代码:"+139+"定单被锁定";break;
  530.    case 140:报警="错误代码:"+140+"只允许看涨仓位";break;
  531.    case 141:报警="错误代码:"+141+"过多请求";break;
  532.    case 145:报警="错误代码:"+145+"因为过于接近市场,修改否定";break;
  533.    case 146:报警="错误代码:"+146+"交易文本已满";break;
  534.    case 147:报警="错误代码:"+147+"时间周期被经纪否定";break;
  535.    case 148:报警="错误代码:"+148+"开单和挂单总数已被经纪限定";break;
  536.    case 149:报警="错误代码:"+149+"当对冲备拒绝时,打开相对于现有的一个单置";break;
  537.    case 150:报警="错误代码:"+150+"把为反FIFO规定的单子平掉";break;
  538.    case 4000:报警="错误代码:"+4000+"没有错误";break;
  539.    case 4001:报警="错误代码:"+4001+"错误函数指示";break;
  540.    case 4002:报警="错误代码:"+4002+"数组索引超出范围";break;
  541.    case 4003:报警="错误代码:"+4003+"对于调用堆栈储存器函数没有足够内存";break;
  542.    case 4004:报警="错误代码:"+4004+"循环堆栈储存器溢出";break;
  543.    case 4005:报警="错误代码:"+4005+"对于堆栈储存器参量没有内存";break;
  544.    case 4006:报警="错误代码:"+4006+"对于字行参量没有足够内存";break;
  545.    case 4007:报警="错误代码:"+4007+"对于字行没有足够内存";break;
  546.    case 4008:报警="错误代码:"+4008+"没有初始字行";break;
  547.    case 4009:报警="错误代码:"+4009+"在数组中没有初始字串符";break;
  548.    case 4010:报警="错误代码:"+4010+"对于数组没有内存";break;
  549.    case 4011:报警="错误代码:"+4011+"字行过长";break;
  550.    case 4012:报警="错误代码:"+4012+"余数划分为零";break;
  551.    case 4013:报警="错误代码:"+4013+"零划分";break;
  552.    case 4014:报警="错误代码:"+4014+"不明命令";break;
  553.    case 4015:报警="错误代码:"+4015+"错误转换(没有常规错误)";break;
  554.    case 4016:报警="错误代码:"+4016+"没有初始数组";break;
  555.    case 4017:报警="错误代码:"+4017+"禁止调用DLL ";break;
  556.    case 4018:报警="错误代码:"+4018+"数据库不能下载";break;
  557.    case 4019:报警="错误代码:"+4019+"不能调用函数";break;
  558.    case 4020:报警="错误代码:"+4020+"禁止调用智能交易函数";break;
  559.    case 4021:报警="错误代码:"+4021+"对于来自函数的字行没有足够内存";break;
  560.    case 4022:报警="错误代码:"+4022+"系统繁忙 (没有常规错误)";break;
  561.    case 4050:报警="错误代码:"+4050+"无效计数参量函数";break;
  562.    case 4051:报警="错误代码:"+4051+"无效参量值函数";break;
  563.    case 4052:报警="错误代码:"+4052+"字行函数内部错误";break;
  564.    case 4053:报警="错误代码:"+4053+"一些数组错误";break;
  565.    case 4054:报警="错误代码:"+4054+"应用不正确数组";break;
  566.    case 4055:报警="错误代码:"+4055+"自定义指标错误";break;
  567.    case 4056:报警="错误代码:"+4056+"不协调数组";break;
  568.    case 4057:报警="错误代码:"+4057+"整体变量过程错误";break;
  569.    case 4058:报警="错误代码:"+4058+"整体变量未找到";break;
  570.    case 4059:报警="错误代码:"+4059+"测试模式函数禁止";break;
  571.    case 4060:报警="错误代码:"+4060+"没有确认函数";break;
  572.    case 4061:报警="错误代码:"+4061+"发送邮件错误";break;
  573.    case 4062:报警="错误代码:"+4062+"字行预计参量";break;
  574.    case 4063:报警="错误代码:"+4063+"整数预计参量";break;
  575.    case 4064:报警="错误代码:"+4064+"双预计参量";break;
  576.    case 4065:报警="错误代码:"+4065+"数组作为预计参量";break;
  577.    case 4066:报警="错误代码:"+4066+"刷新状态请求历史数据";break;
  578.    case 4067:报警="错误代码:"+4067+"交易函数错误";break;
  579.    case 4099:报警="错误代码:"+4099+"文件结束";break;
  580.    case 4100:报警="错误代码:"+4100+"一些文件错误";break;
  581.    case 4101:报警="错误代码:"+4101+"错误文件名称";break;
  582.    case 4102:报警="错误代码:"+4102+"打开文件过多";break;
  583.    case 4103:报警="错误代码:"+4103+"不能打开文件";break;
  584.    case 4104:报警="错误代码:"+4104+"不协调文件";break;
  585.    case 4105:报警="错误代码:"+4105+"没有选择定单";break;
  586.    case 4106:报警="错误代码:"+4106+"不明货币对";break;
  587.    case 4107:报警="错误代码:"+4107+"无效价格";break;
  588.    case 4108:报警="错误代码:"+4108+"无效定单编码";break;
  589.    case 4109:报警="错误代码:"+4109+"不允许交易";break;
  590.    case 4110:报警="错误代码:"+4110+"不允许长期";break;
  591.    case 4111:报警="错误代码:"+4111+"不允许短期";break;
  592.    case 4200:报警="错误代码:"+4200+"定单已经存在";break;
  593.    case 4201:报警="错误代码:"+4201+"不明定单属性";break;
  594.    //case 4202:报警="错误代码:"+4202+"定单不存在";break;
  595.    case 4203:报警="错误代码:"+4203+"不明定单类型";break;
  596.    case 4204:报警="错误代码:"+4204+"没有定单名称";break;
  597.    case 4205:报警="错误代码:"+4205+"定单坐标错误";break;
  598.    case 4206:报警="错误代码:"+4206+"没有指定子窗口";break;
  599.    case 4207:报警="错误代码:"+4207+"定单一些函数错误";break;
  600.    case 4250:报警="错误代码:"+4250+"错误设定发送通知到队列中";break;
  601.    case 4251:报警="错误代码:"+4251+"无效参量- 空字符串传递到SendNotification()函数";break;
  602.    case 4252:报警="错误代码:"+4252+"无效设置发送通知(未指定ID或未启用通知)";break;
  603.    case 4253:报警="错误代码:"+4253+"通知发送过于频繁";break;
  604.    }
  605.    if(t!=0)
  606.    {
  607.    Print(a+报警);
  608.    laber(a+报警,Yellow);
  609.    }
  610. }
复制代码


本地和远程跟单(模拟测试谨慎使用).rar

188.41 KB, 下载次数: 12, 下载积分: 金钱 -8

0

主题

31

积分

0

精华

外汇入门

金钱
31 美元
权重
0
发表于 2014-9-10 11:56 | 显示全部楼层
本帖最后由 wccmcd 于 2015-12-4 12:39 编辑

本地和远程跟单端口

您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2021 fx3q.com Powered by Discuz! X3
浙ICP备: ICP14039028

浙公网安备 33011802001420号

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

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