分享

交易系统

 che_dream 2010-10-17


//+------------------------------------------------------------------+

//|      Hans123MV22 |

//|    Copyright ?2006, Milan Volf |

//|                                                                  |

//+------------------------------------------------------------------+

#property copyright "Copyright ?2006, Milan Volf"

//---- input parameters

extern int       Start1=10;           //begin of the first session;  adjust by your broker 

extern int       Start2=14;           //begin of the second session

extern int       EOD=24;              // for closing orders at end of day

extern int       FridayClosing=23;    //broker friday closing time

extern bool      FirstSessionOnly=0;  //if it equals 1, it trades the first range only (for testing)

extern int       Length=4;            //length of range for determining high/low

extern int       Pips=5;              //trigger above/bellow range

extern int       StopLoss=50;

extern int       BreakEven=30;

extern int       TrailingStop=0;      //if equals 0, it uses breakeven

extern int       TakeProfit=80;

extern double    Lots=1;

//+------------------------------------------------------------------+

//| expert start function                                            |

//+------------------------------------------------------------------+

int start()

  {

   //---- 

   int i,Ticket,MN;

   

   //Normalize times

   if(EOD==24) EOD=0;

   if(FridayClosing==0) FridayClosing=24;

   

   //Setup comment

   string Text="Hans123"+Symbol();

   //Setup orders

   if(Hour()==Start1 && Minute()<10){

      MN=1;

      SetOrders(Text,MN);

   }

   if(Hour()==Start2 && Minute()<10 && FirstSessionOnly==0){

      MN=2;

      SetOrders(Text,MN);

   }

   

   //Manage opened orders

   for (i=0;i<OrdersTotal();i++){

      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

      if(OrderComment()==Text){

         //close open positions at EOD

         if(Hour()==EOD || (DayOfWeek()>=5 && Hour()==FridayClosing-1 && Minute()>=50)){ 

            switch (OrderType()){

               case OP_BUY: OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);

               break;

               case OP_SELL: OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);

               break;

               default: OrderDelete(OrderTicket());

               break;

            }

            Sleep(10000);

         }

         else {

            //move at BE if profit>BE

            if(TrailingStop==0){ 

               if(OrderType()==OP_BUY){

                  if(High[0]-OrderOpenPrice()>=BreakEven*Point && OrderStopLoss()<OrderOpenPrice()){

                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);

                     Sleep(10000);

                  }   

               }   

               if(OrderType()==OP_SELL){

                  if(OrderOpenPrice()-Low[0]>=BreakEven*Point && OrderStopLoss()>OrderOpenPrice()){

                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);

                     Sleep(10000);

                  }

               }

            }

            //use trailing stop

            else {                  

               if(OrderType()==OP_BUY){

                  if(High[0]-OrderStopLoss()>TrailingStop*Point){

                     OrderModify(OrderTicket(),OrderOpenPrice(),High[0]-TrailingStop*Point,OrderTakeProfit(),0,Green);

                     Sleep(10000);

                  }   

               }   

               if(OrderType()==OP_SELL){

                  if(OrderStopLoss()-Low[0]>TrailingStop*Point){

                     OrderModify(OrderTicket(),OrderOpenPrice(),Low[0]+TrailingStop*Point,OrderTakeProfit(),0,Green);

                     Sleep(10000);

                  }

               }

            }

         }

      }

   }

   

   return(0);

   }

//+------------------------------------------------------------------+

void SetOrders(string Text,int MN){

   int i,Ticket,Bought,Sold;

   double EntryLong,EntryShort,SLLong,SLShort,TPLong,TPShort;

   //Determine range

   EntryLong   =iHigh(NULL,60,Highest(NULL,60,MODE_HIGH,Length,1))+(Pips/*+MarketInfo(Symbol(),MODE_SPREAD)*/)*Point;

   EntryShort  =iLow (NULL,60,Lowest (NULL,60,MODE_LOW, Length,1))-Pips*Point;

   SLLong      =MathMax(EntryLong-StopLoss*Point,EntryShort);

   SLShort     =MathMin(EntryShort+StopLoss*Point,EntryLong);

   TPLong      =EntryLong+TakeProfit*Point;

   TPShort     =EntryShort-TakeProfit*Point;

   

   //Send orders

   for (i=0;i<OrdersTotal();i++){

      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

      if(OrderComment()==Text && OrderMagicNumber()==MN){

         if(OrderType()==OP_BUYSTOP || OrderType()==OP_BUY) Bought++;

         if(OrderType()==OP_SELLSTOP || OrderType()==OP_SELL) Sold++;

      }

   }

   if(Bought==0){ //no buy order

      Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,EntryLong,3,SLLong,TPLong,Text,MN,0,Blue);

      if(Ticket<0 && High[0]>=EntryLong)

         Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SLLong,TPLong,Text,MN,0,Blue);

         Sleep(10000); 

   }

   if(Sold==0){ //no sell order

      Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,EntryShort,3,SLShort,TPShort,Text,MN,0,Magenta);

      if(Ticket<0 && Low[0]<=EntryShort)

         Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SLShort,TPShort,Text,MN,0,Magenta);

         Sleep(10000); 

   }

   //Check orders

   for (i=0;i<OrdersTotal();i++){

      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

      if(OrderComment()==Text && OrderMagicNumber()==MN){

         if(OrderType()==OP_BUYSTOP && (MathAbs(OrderOpenPrice()-EntryLong)>Point 

         || MathAbs(OrderStopLoss()-SLLong)>Point || MathAbs(OrderTakeProfit()-TPLong)>Point))

            OrderModify(OrderTicket(),EntryLong,SLLong,TPLong,0,Blue);

         if(OrderType()==OP_SELLSTOP && (MathAbs(OrderOpenPrice()-EntryShort)>Point 

         || MathAbs(OrderStopLoss()-SLShort)>Point || MathAbs(OrderTakeProfit()-TPShort)>Point))

            OrderModify(OrderTicket(),EntryShort,SLShort,TPShort,0,Magenta);

      }

   }

}

//+------------------------------------------------------------------+

//|   Hans Breakout.mq4                              |

//|   Copyright ?2006  Scorpion@fxfisherman.com        |

//+------------------------------------------------------------------+

#property copyright "WWW.FXFISH.com"

#property link      "http://www."

#property indicator_chart_window

#property indicator_buffers 4

#property indicator_color1 Red

#property indicator_color2 Blue

#property indicator_color3 Red

#property indicator_color4 Blue

extern int       Breakout_Pips=5;

extern int       Exit_Hour = 23;

extern int       From_Hour_1 = 6;

extern int       From_Minute_1 = 0;

extern int       To_Hour_1   = 9;

extern int       To_Minute_1 = 59;

extern int       From_Hour_2 = 10;

extern int       From_Minute_2 = 0;

extern int       To_Hour_2   = 13;

extern int       To_Minute_2 = 59;

extern int Bars_Count= 10000;

//---- buffers

double v1[];

double v2[];

double v3[];

double v4[];

  

int init()

  {

   IndicatorBuffers(4);

  

   SetIndexArrow(0, 159);

   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,Red);

   SetIndexDrawBegin(0,-1);

   SetIndexBuffer(0, v1);

   SetIndexLabel(0,"High1");

   

   SetIndexArrow(1, 159); 

   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,Blue);

   SetIndexDrawBegin(1,-1);

   SetIndexBuffer(1, v2);

   SetIndexLabel(1,"Low1");

   

   SetIndexArrow(2, 159);

   SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID,1,Red);

   SetIndexDrawBegin(2,-1);

   SetIndexBuffer(2, v3);

   SetIndexLabel(2,"High2");

   

   SetIndexArrow(3, 159); 

   SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID,1,Blue);

   SetIndexDrawBegin(3,-1);

   SetIndexBuffer(3, v4);

   SetIndexLabel(3,"Low2");

   

   watermark();

   return(0);

  }

int start()

{

  int i;

  int shift; 

  double price;

  date calculated1, calculated2;

  double pipsBreakout = Breakout_Pips * Point;

  i = Bars_Count;

  while(i>=0)

   {

    // High/Low 1

    date today = StripTime(Time);

    int nowMins = TimeHour(Time) * 60 + TimeMinute(Time);

    if (calculated1 < today && nowMins > (To_Hour_1 * 60) + To_Minute_1)

    {

      calculated1 = today;

      double highest1 = High[GetHighest(Symbol(), Period(), MODE_HIGH, Time, From_Hour_1, From_Minute_1, To_Hour_1, To_Minute_1)];

      double lowest1 = Low[GetLowest(Symbol(), Period(), MODE_LOW, Time, From_Hour_1, From_Minute_1, To_Hour_1, To_Minute_1)];

    }

    if (calculated1 == today && nowMins < Exit_Hour * 60)

    {

      v1 = highest1 + pipsBreakout;

      v2 = lowest1 - pipsBreakout;

    }

    

    // High/Low 2

    if (calculated2 < today && nowMins > (To_Hour_2 * 60) + To_Minute_2)

    {

      calculated2 = today;

      double highest2 = High[GetHighest(Symbol(), Period(), MODE_HIGH, Time, From_Hour_2, From_Minute_2, To_Hour_2, To_Minute_2)];

      double lowest2 = Low[GetLowest(Symbol(), Period(), MODE_LOW, Time, From_Hour_2, From_Minute_2, To_Hour_2, To_Minute_2)];

    }

    if (calculated2 == today && nowMins < Exit_Hour * 60)

    {

      v3 = highest2 + pipsBreakout;

      v4 = lowest2 - pipsBreakout;

    }

    

    i--;

   }   

  return(0);

}

//+------------------------------------------------------------------+

date StripTime(datetime dt)

{

  return (dt - (TimeHour(dt)*3600) - (TimeMinute(dt)*60) - TimeSeconds(dt));

}

//+------------------------------------------------------------------+

//| Get highest/lowest bar between a time period.                    |

//+------------------------------------------------------------------+

int GetHighest(string symbol, int timeframe, int price_mode, datetime date, int from_hour, int from_minute, int to_hour, int to_minute)

{

  date = StripTime(date);

  datetime from_time = date + (from_hour * 3600) + (from_minute * 60);

  datetime to_time = date + (to_hour * 3600) + (to_minute * 60);

  int from_bar = iBarShift(symbol, timeframe, from_time, false);

  int to_bar = iBarShift(symbol, timeframe, to_time, false);

  int hh = Highest(symbol, timeframe, price_mode, from_bar - to_bar + 1, to_bar);

  return(hh);

}

int GetLowest(string symbol, int timeframe, int price_mode, datetime date, int from_hour, int from_minute, int to_hour, int to_minute)

{

  date = StripTime(date);

  datetime from_time = date + (from_hour * 3600) + (from_minute * 60);

  datetime to_time = date + (to_hour * 3600) + (to_minute * 60);

  int from_bar = iBarShift(symbol, timeframe, from_time, false);

  int to_bar = iBarShift(symbol, timeframe, to_time, false);

  int ll = Lowest(symbol, timeframe, price_mode, from_bar - to_bar + 1, to_bar);

  return(ll);

}

void watermark()

  {

   ObjectCreate("fxfisherman", OBJ_LABEL, 0, 0, 0);

   ObjectSetText("fxfisherman", "WWW.FXFISH.COM", 11, "Lucida Handwriting", Snow);

   ObjectSet("fxfisherman", OBJPROP_CORNER, 2);

   ObjectSet("fxfisherman", OBJPROP_XDISTANCE, 5);

   ObjectSet("fxfisherman", OBJPROP_YDISTANCE, 10);

   return(0);

  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多