9评论

1收藏

如何移动挂单跟随价格变动

 

avatar hbshzhb | 7635 人阅读 | 9 人评论 | 2016-01-23

请教大神,我想让挂单跟着价格移动,该怎样写程序,还请贴上源码,谢谢了。

例如:  下买挂单,当价格下移时候,挂单跟随下移,当价格上涨,挂单停止移动,等待成交。

""
还没有人打赏,支持一下

评论|共 9 个

Nick_Xu

发表于 2016-1-23 14:51:53 | 显示全部楼层

帮顶,我也想知道!~~~~~~~~~~~~~~

hbshzhb

发表于 2016-1-30 16:35:06 | 显示全部楼层

请教大神,我想让挂单跟着价格移动,该怎样写程序,还请贴上源码,谢谢了。

例如:  下买挂单,当价格下移时候,挂单跟随下移,当价格上涨,挂单停止移动,等待成交。

hebpmo

发表于 2016-2-21 13:39:27 | 显示全部楼层

参考止损下移的方法。
都给你贴上,我也不会这个,你要不懂找人看吧
#include <MTDinc.mqh>
//+------------------------------------------------------------------+
//|                           复盘EA演示:   追踪止损和固定止损止盈
//+------------------------------------------------------------------+
#property copyright "MTDriver复盘专家 chaokes.com"
#property link      "http://chaokes.com"

//---- input parameters
extern double       止赢=240;
extern double       止损=168;
extern double       追踪止损=360;//移动止损的具体价格偏移值,如果值为0表示不起作用
extern int       Magic=0;
extern string    参数说明="单位为点数";

string id_pre="MTD_zzzs_";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   deleteOBJ_StartsWith(id_pre);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   deleteOBJ_StartsWith(id_pre);
//----
   return(0);
  }
  
int ids=0;  


  
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    double myPoint=Point;
    //Alert(DoubleToStr(myPoint,8));
   
    ids=0;
    DrawOneMessage("EA -自动追踪止损运行中 , "+Symbol(),DeepPink,12);
    //ids++;
   
   
    //追踪止损
    if(追踪止损>0){
       _MoveStop(Magic, 追踪止损*myPoint,0*myPoint);//其中追踪止损单位为点数,追踪止损*myPoint=实际的止损值   
       DrawOneMessage("追踪止损= "+追踪止损+"点="+DoubleToStr(追踪止损*myPoint,Digits),clrYellow,12);
    }else{
       DrawOneMessage("追踪止损= "+追踪止损+"点(未启用)",clrGray,12);
    }
   
    //设置止赢
    if(止赢>0){
       _TakeProfit(Magic,止赢*myPoint);
       DrawOneMessage("首次止赢= "+止赢+"点="+DoubleToStr(止赢*myPoint,Digits),clrYellow,12);
    }else{
       DrawOneMessage("首次止赢= "+止赢+"点(未启用)",clrGray,12);
    }
   
   
    //设置止损
    if(止损>0){
       _StopLoss(Magic,止损*myPoint);
       DrawOneMessage("首次止损= "+止损+"点="+DoubleToStr(止损*myPoint,Digits),clrYellow,12);
    }else{
       DrawOneMessage("首次止损= "+止损+"点(未启用)",clrGray,12);
    }
   
   
    DrawOneMessage("Magic     =  "+Magic,clrYellow,12);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| _MoveStop 移动止损函数 function                                               |
//+------------------------------------------------------------------+
int _MoveStop(int MAGIC, double MOVE,double STEP)//_MoveStop(MAGIC, MOVE);
  {
//----
   //Alert("追踪止损MOVE="+MOVE);
   if (MOVE<=0) return(0);
   double MoveStopPrice;
   for ( int z = MTDOrdersTotal() - 1; z >= 0; z -- )
   {
     if ( !MTDOrderSelect( z, SELECT_BY_POS ) )
     {
       Print("MTDOrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
       continue;
     }
     if (MTDOrderSymbol()!=Symbol())continue;
     if (MTDOrderMagicNumber() != MAGIC )continue;
     switch (MTDOrderType())
     {
       case OP_BUY   :  
       {
         
         MoveStopPrice=NormalizeDouble(MTDBid()-MOVE,Digits);//
         //Alert(MoveStopPrice+" , "+MTDOrderTicket());
         if (MoveStopPrice>MTDOrderOpenPrice() && (MoveStopPrice>MTDOrderStopLoss() || MTDOrderStopLoss()==0)){  //追踪止损的价格>开仓价 ,并且追踪止损的价格>当前止损价,就移动止损
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),MoveStopPrice+STEP,MTDOrderTakeProfit(),MTDOrderExpiration())) {   //
             Alert("MoveStop_MTDOrderModify Error #",GetLastError());
             return(-1);
           }
         }
         continue;
       }
       case OP_SELL:
       {
         MoveStopPrice=NormalizeDouble(MTDAsk()+MOVE,Digits);
         //Alert(MTDAsk()+","+MOVE+";"+MoveStopPrice+" , "+MTDOrderTicket());
         if (MoveStopPrice<MTDOrderOpenPrice() && (MoveStopPrice<MTDOrderStopLoss() || MTDOrderStopLoss()==0))
         {
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),MoveStopPrice-STEP,MTDOrderTakeProfit(),MTDOrderExpiration())){     //
             Alert("MoveStop_MTDOrderModify Error #",GetLastError());
             return(-1);
           }
         }
         continue;
       }
       default: continue;
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| 止盈函数 function                                               |
//+------------------------------------------------------------------+
int _TakeProfit(int MAGIC, double TP)//
  {
//----
   if (TP<=0) return(0);
   double TakeProfit;
   int OrdersTotal4TakeProfit=MTDOrdersTotal();
   for ( int z = OrdersTotal4TakeProfit - 1; z >= 0; z -- )
   {
     if ( !MTDOrderSelect( z, SELECT_BY_POS ) )
     {
       Print("MTDOrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
       continue;
     }
     if (MTDOrderSymbol()!=Symbol())continue;
     if (MTDOrderMagicNumber() != MAGIC )continue;
     switch (MTDOrderType())
     {
       case OP_BUY   :  
       {
         TakeProfit=NormalizeDouble(MTDOrderOpenPrice()+TP,Digits);
         if (MTDOrderTakeProfit()==0.0)
         {
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),MTDOrderStopLoss(),TakeProfit,MTDOrderExpiration()))
           {
             Alert("TakeProfit_MTDOrderModify Error #",GetLastError());
           }
         }
         continue;
       }
       case OP_SELL:
       {
         TakeProfit=NormalizeDouble(MTDOrderOpenPrice()-TP,Digits);
         if (MTDOrderTakeProfit()==0.0)
         {
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),MTDOrderStopLoss(),TakeProfit,MTDOrderExpiration()))
           {
             Alert("TakeProfit_MTDOrderModify Error #",GetLastError());
           }
         }
         continue;
       }
       default: continue;
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| 止损函数 function                                               |
//+------------------------------------------------------------------+
int _StopLoss(int MAGIC, double SL)//_MoveStop(MAGIC, MOVE);
  {
//----
   if (SL<=0) return(0);//0表示不执行止损
   double StopLoss;
   int OrdersTotal4StopLoss=MTDOrdersTotal();

   for ( int z = OrdersTotal4StopLoss - 1; z >= 0; z -- )
   {
     if ( !MTDOrderSelect( z, SELECT_BY_POS ) )
     {
       Print("MTDOrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
       continue;
     }
     if (MTDOrderSymbol()!=Symbol())continue;
     if (MTDOrderMagicNumber() != MAGIC )continue;
     switch (MTDOrderType())
     {
       case OP_BUY   :  
       {
         StopLoss=NormalizeDouble(MTDOrderOpenPrice()-SL,Digits);
         //Alert(DoubleToStr(StopLoss,Digits));
         if (MTDOrderStopLoss()==0.0)
         {
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),StopLoss,MTDOrderTakeProfit(),MTDOrderExpiration()))
           {
             Alert("StopLoss_MTDOrderModify Error #",GetLastError());
           }
         }
         continue;
       }
       case OP_SELL:
       {
         StopLoss=NormalizeDouble(MTDOrderOpenPrice()+SL,Digits);
         if (MTDOrderStopLoss()==0.0)
         {
           if(!MTDOrderModify(MTDOrderTicket(),MTDOrderOpenPrice(),StopLoss,MTDOrderTakeProfit(),MTDOrderExpiration()))
           {
             Alert("StopLoss_MTDOrderModify Error #",GetLastError());
           }
         }
         continue;
       }
       default: continue;
     }
   }
//----
   return(0);
  }
  

//+------------------------------------------------------------------+
void Drawlabel(int x, int y,string text, color fcolor=Lime,int fsize=12)
{
      
      string id=id_pre+ids;
      string font="Arial";
      ObjectDelete(id);
      ObjectCreate( id, OBJ_LABEL, 0, 0, 0 );
      ObjectSetText(id,text,fsize,font,fcolor);
      ObjectSet( id, OBJPROP_XDISTANCE, x );
      ObjectSet( id, OBJPROP_YDISTANCE, y );
      ObjectSet( id, OBJPROP_BACK, true );
      //ObjectSet( id, OBJPROP_CORNER, corner );
      ObjectSet( id, OBJPROP_CORNER, 0);
}

void DrawOneMessage(string text, color fcolor,int fsize){
   int x=365,y=66;
   y=y+20*ids;
   Drawlabel(x,y,text,fcolor,fsize);


   ids=ids+1;
}

//删除xx开头的对象
void deleteOBJ_StartsWith(string findText){
  string ObjName;
  //int ObjType;
  double OBJ_ARROW_PRICE1=0;
  int obj_count=ObjectsTotal();
  for (int i = 0; i < obj_count; i++)
  {
    ObjName = ObjectName(i);
    int index=StringFind(ObjName, findText, 0);
    if(index==0){
      if(ObjectDeleteFromName(ObjName)==true){
         i=i-1;
         obj_count=ObjectsTotal();
      }
    }   
  }
  //return (0);
}  

//删除具体的某个对象
bool ObjectDeleteFromName(string ObjName){
         bool result=true;
         int try_again=10;//
         while(try_again>0){
            if(ObjectDelete(ObjName)==true){
               try_again=0;
               result=true;
            }else{
               try_again=try_again-1;
               result=false;
            }            
         }
         return (result);
}

hbshzhb

发表于 2016-3-6 08:31:11 | 显示全部楼层

挂单移动,指的是单子跟随价格,也应该是开盘价格移动,而不是已经成交后的单子的止损价格移动。谢谢了,我研究研究,还希望高手帮助。

kingshuan

发表于 2016-4-13 00:40:35 | 显示全部楼层

一直在移动怎么成交?我可以写。不过我还是不懂原理。你可以私信我。

金币

参与人数 1金币 +2 收起 理由
451210435 + 2 当某一柱价格达到300点,建立与价格差几点.

查看全部打赏

49044000

发表于 2016-7-1 13:27:28 | 显示全部楼层

顶起来!!!!!!!!!!!!!

wayne20151515

发表于 2016-7-3 03:37:59 | 显示全部楼层

dsfgadsadsaFdsf

信心

发表于 2017-10-19 11:24:58 | 显示全部楼层

33333333333333

jgr

发表于 2022-1-2 10:04:04 | 显示全部楼层

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则