- //+------------------------------------------------------------------+
- //| ma.mq4 |
- //| dzsq |
- //| https://www.mql5.com |
- //+------------------------------------------------------------------+
- #property copyright "dzsq"
- #property link "https://www.mql5.com"
- #property version "1.00"
- #property strict
-
-
- extern int longMa=20; //长均线
- extern int shortMa=10; //短均线
- extern int callBachMa=30;
-
- extern int stop = 300; //止损
- extern int limit = 900; //止盈
- extern double lots=1; //手数
- extern double movestop = 500; //移动止损
- extern int magic = 12345;
-
- bool isCrossBuy = false; //是否交叉
- bool isCrossSell = false;
- //是否会调到支撑线
- bool isSellCallback = false;
- bool isBuyCallback = false;
- //是否开仓
- bool isBuyOpened=false;
- bool isSellOpened=false;
-
- datetime buytime=0;
- datetime selltime=0;
- //+------------------------------------------------------------------+
- //| Expert initialization function |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- //---
-
- //---
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| Expert deinitialization function |
- //+------------------------------------------------------------------+
- void OnDeinit(const int reason)
- {
- //---
-
- }
- //+------------------------------------------------------------------+
- //| Expert tick function |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- //向下取整
- //lots = MathFloor(AccountBalance()/10000);
- //获取所有的均线价格,长期,短期,回调
- double longmaPrice1 = iMA(NULL,0,longMa,0,MODE_SMA,PRICE_CLOSE,1);
- double longmaPrice2 = iMA(NULL,0,longMa,0,MODE_SMA,PRICE_CLOSE,2);
- double shortmaPrice1 = iMA(NULL,0,shortMa,0,MODE_SMA,PRICE_CLOSE,1);
- double shortmaPrice2 = iMA(NULL,0,shortMa,0,MODE_SMA,PRICE_CLOSE,2);
- double callBackPrice = iMA(NULL,0,callBachMa,0,MODE_SMA,PRICE_CLOSE,0);
-
- //均线交叉多头
- if (shortmaPrice1>longmaPrice1 && shortmaPrice2<longmaPrice2){
- isCrossBuy = true;
- isCrossSell = false;
- isSellOpened = false;
- isSellCallback = false;
- closesell(Symbol()+"sell",magic);
- }
-
- //均线交叉空头
- if (shortmaPrice1<longmaPrice1 && shortmaPrice2>longmaPrice2){
- isCrossBuy = false;
- isCrossSell = true;
- isBuyOpened = false;
- isBuyCallback = false;
- closebuy(Symbol()+"buy",magic);
- }
-
- double lowPrice = Low[0];
- double highPrice = High[0];
- double openPrice = Open[0];
- double closePrice = Close[0];
- //符合做多的条件
- if(!isBuyOpened && isCrossBuy && lowPrice < callBackPrice){
- //time[0] 表示当前时间
- if (buytime!=Time[0]){ //解决当前K线重复下单的问题
- if ( buy(lots,stop,limit,Symbol()+"buy",magic)){
- buytime=Time[0];
- isBuyOpened = true;
- }
-
- }
- }
- //符合做空的条件
- if(!isSellOpened && isCrossSell && highPrice > callBackPrice){
- //time[0] 表示当前时间
- if (selltime!=Time[0]){ //解决当前K线重复下单的问题
- if (sell(lots,stop,limit,Symbol()+"sell",magic)){
-
- selltime=Time[0];
- isSellOpened = true;
-
- }
-
- }
- }
- yidongzhisun();
- }
-
- //下单函数 针对一个单子
- int buy(double lots,double stop , double limit,string comm,int buymagic){ //手数,止损,止盈,注释,magic
- int ticket=0; //订单号
- bool zhaodan = false; //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
- for (int i=0; i < OrdersTotal(); i++){
-
- if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
- string zhushi = OrderComment();
- int magicNumber = OrderMagicNumber();
-
- if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && zhushi==comm && magicNumber==buymagic){
- zhaodan = true;
- break;
- }
- }
- }
- if (zhaodan==false){
- if (stop!=0 && limit==0){
- ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-stop*Point,0,comm,buymagic,0,White);
- }
- if (stop==0 &&limit!=0)
- ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,Ask+limit*Point,comm,buymagic,0,White);
- if (stop==0 &&limit==0)
- ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,0,comm,buymagic,0,White);
-
- if (stop!=0 &&limit!=0)
- ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-stop*Point,Ask+limit*Point,comm,buymagic,0,White);
-
- }
-
- return (ticket);
-
- }
-
- //下单函数 针对一个单子
- int sell(double lots,double stop , double limit,string comm,int sellmagic){ //手数,止损,止盈,注释,magic
- int ticket=0; //订单号
- bool zhaodan = false; //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
- for (int i=0; i < OrdersTotal(); i++){
-
- if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
- string zhushi = OrderComment();
- int magicNumber = OrderMagicNumber();
-
- if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && zhushi==comm && magicNumber==sellmagic){
- zhaodan = true;
- break;
- }
- }
- }
- if (zhaodan==false){
- if (stop!=0 && limit==0){
- ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+stop*Point,0,comm,sellmagic,0,White);
- }
- if (stop==0 &&limit!=0)
- ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,Bid-limit*Point,comm,sellmagic,0,White);
- if (stop==0 &&limit==0)
- ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,0,comm,sellmagic,0,White);
-
- if (stop!=0 &&limit!=0)
- ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+stop*Point,Bid-limit*Point,comm,sellmagic,0,White);
-
- }
-
- return (ticket);
-
- }
- // 平货币
- void closebuy(string comm,int magic){
- for (int i=OrdersTotal()-1; i >=0; i--){
- if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
-
- if (OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderComment() == comm && OrderMagicNumber() == magic){
- OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
- }
- }
- }
-
- }
- // 平货币
- void closesell(string comm,int magic){
- for (int i=OrdersTotal()-1; i >=0; i--){
- if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
-
- if (OrderSymbol()==Symbol() && OrderType()== OP_SELL && OrderComment() == comm && OrderMagicNumber() == magic){
- OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
- }
- }
- }
-
- }
- //设置移动止损
- void yidongzhisun(){
- for (int i=0; i<OrdersTotal();i++)
- {
- if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
-
- if (OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == magic){
-
- if ((Bid-OrderOpenPrice())>=Point*movestop){
-
- if (OrderStopLoss() <(Bid-Point*movestop) || OrderStopLoss()==0){
- OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*movestop,OrderTakeProfit(),0,Green);
- }
- }
- }
- if (OrderSymbol()==Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == magic){
-
- if ((OrderOpenPrice()-Ask)>=Point*movestop){
-
- if (OrderStopLoss() <(Ask + Point*movestop) || OrderStopLoss()==0){
- OrderModify(OrderTicket(),OrderOpenPrice(),Ask + Point*movestop,OrderTakeProfit(),0,Green);
- }
- }
- }
- }
- }
- }
-
- //+------------------------------------------------------------------+
-
复制代码
|