📅 财经日历 📊 实时波动 📈 大盘云图 📶 行情走势 🆚 投机情绪 🚀 今日热点

    马丁源码

    2020-12-31 · 15619 阅读
    #property copyright "Copyright 2014, 浪人EA工作室"
    #property link      "www.langrenea.com"
    #property version   "1.00"
    #property strict
    #property   description   "[简    介]  “双向马丁,适合震荡行情"
    #property   description   "[所 有 权]  “本EA由浪人EA工作室开发"
    #property   description   "[合作模式]  “资管、EA代挂,策略编写 联系方式 QQ:353666939  WX:N18616865140"
    #property   description   "[操作建议]  “适合震荡行情,更多详情请联系浪人EA工作室"
    input double starLotsSize = 0.01;   //第一单大小
    input int getProfitPoint = 100;     //需要获利多少个点
    input int startGrowthDis  = 100;      //默认加仓点数
    input double overweight = 1.5;        //翻倍系数
    input int closeCurrentOrderNo = 100 ;  //大于多少单止损
    input bool notOpenBuy   = false; // 不开buy 单
    input bool notOpenSell  = false; // 不开Sell 单
    input bool OpenIncreaseOpint = false;   // 是否增涨点数
    input int  increasePoint = 0;         //增涨点数
    input bool SecondOpen = false;    //改变间距
    input bool isfixedDis = true;    //是否为固定间距
    input int fixedDis = 1000;       //固定间距
    input double SecondOpenPrice = 0.00000;// 填写价格
    input int MagicNumber = 16888888;
    extern bool InformationOnChart = TRUE; //  是否显示信息
    double lastPoint =0.0;
    bool isWorked = true;              //是否工作
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
       {
        return(INIT_SUCCEEDED);
       }
      //+------------------------------------------------------------+
      // 我写的funcation  买卖
      //+-------------------------------------------------------------
    void checkFristOrder(){
        if(OrdersTotal() != 0){
           if(!checkHadOrderByType(OP_BUY) && notOpenBuy == false){
              iOpenOrder(OP_BUY,starLotsSize,0,getProfitPoint);
           }
           if(!checkHadOrderByType(OP_SELL) && notOpenSell == false){
              iOpenOrder(OP_SELL,starLotsSize,0,getProfitPoint);
           }
        }else{
           if(notOpenBuy== false){
              iOpenOrder(OP_BUY,starLotsSize,0,getProfitPoint);
           }
           if(notOpenSell == false){
              iOpenOrder(OP_SELL,starLotsSize,0,getProfitPoint);
           }
        }
    }
    bool checkHadOrderByType(int opt_Type){
        bool returnValue = false;
        for (int index = OrdersTotal() - 1; index >= 0; index--){
           if(OrderSelect(index,SELECT_BY_POS,MODE_TRADES)==true){
              if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue;
              if(OrderType() == opt_Type ){
                 returnValue = true;
              }
           }
        }
        return returnValue;
    }
    /**获取下一次开仓点位*/
    int getNextOrderDis(int orderCount){
        if(orderCount < 0){
           return -1;
        }
        int temp_dis = startGrowthDis;
        if(OpenIncreaseOpint == true && orderCount >=1){//从第二单开始增加
           temp_dis = startGrowthDis + ( orderCount * increasePoint);
        }
        return temp_dis;
    }
    void openNextOrder(){
        if(OrdersTotal() < 1 ) return;
       
        if(notOpenBuy== false){
           openBuyNextOrder();
        }
        if(notOpenSell == false){
           openSellNextOrder();
        }
    }
    /**
        开buy单的下一单
    **/
    void openBuyNextOrder(){
        //获取当前第几单
        int buy_total =  getEaSymbolTotal(OP_BUY)-1;
        //获取最大的
        int lastBuyTicket = getLastOrderByType(OP_BUY);
        if(OrderSelect(lastBuyTicket,SELECT_BY_TICKET,MODE_TRADES)==true){
          double tempBuyPrice = OrderOpenPrice();
          int tempBuyDis = (Bid - tempBuyPrice)/Point;
          int temp_dis = startGrowthDis;
          if(buy_total > 0){
              temp_dis = getNextOrderDis(buy_total);
          }
           if(tempBuyDis <  0  &&  MathAbs(tempBuyDis)>= temp_dis){
              if(buy_total >=  closeCurrentOrderNo){
                 if(SecondOpen ==true && isfixedDis == true){//
                       if(MathAbs(tempBuyDis) >= fixedDis){
                          iOpenOrder(OP_BUY,NormalizeDouble(OrderLots() * overweight,2),0,0);
                          alterGetProfitByBuy();
                       }
                    }else if(SecondOpen ==true && isfixedDis == false){
                       if(Ask  <=  SecondOpenPrice){
                          iOpenOrder(OP_BUY,NormalizeDouble(OrderLots() * overweight,2),0,0);
                          alterGetProfitByBuy();
                       }
                    }
              }else{
                 iOpenOrder(OP_BUY,NormalizeDouble(OrderLots() * overweight,2),0,0);
                 alterGetProfitByBuy();
              }
           }
         }
    }

    void openSellNextOrder(){
           //获取当前第几单
           int sell_total =  getEaSymbolTotal(OP_SELL)-1;
           //获取最大的
           int lastSellTicket = getLastOrderByType(OP_SELL);
           if(OrderSelect(lastSellTicket,SELECT_BY_TICKET,MODE_TRADES)==true){//SEll单
           double tempSellPrice = OrderOpenPrice();
           int tempSellDis = (tempSellPrice - Ask)/Point;
           int temp_dis = startGrowthDis;
           if(sell_total > 0){
              temp_dis = getNextOrderDis(sell_total);
           }
           if(tempSellDis <  0  &&  MathAbs(tempSellDis) >= temp_dis){
              if(sell_total >=  closeCurrentOrderNo){
                 if(SecondOpen ==true && isfixedDis == true){
                    if(MathAbs(tempSellDis)>= fixedDis){
                       iOpenOrder(OP_SELL,NormalizeDouble(OrderLots() * overweight,2),0,0);
                       alterGetProfitBySell();
                    }
                 }else if(SecondOpen ==true && isfixedDis == false){
                    if(Bid >= SecondOpenPrice){
                       iOpenOrder(OP_SELL,NormalizeDouble(OrderLots() * overweight,2),0,0);
                       alterGetProfitBySell();
                    }
                 }
              }else{
                 iOpenOrder(OP_SELL,NormalizeDouble(OrderLots() * overweight,2),0,0);
                 alterGetProfitBySell();
              }
           }
         }
    }

    /**
        修改BUY止盈
    */
    void alterGetProfitByBuy(){
        //获取所有的手数
        double temp_Lots = getRealLotByType(OP_BUY);
        if(temp_Lots == 0){
           return ;
        }
        //获取所有的亏损记录
        double temp_prifit = getProfitBuyType(OP_BUY);
        //获取货币对的点值
        double ticket_Value = MarketInfo(Symbol(),MODE_TICKVALUE);
        if(temp_prifit < 0){
           temp_prifit =  MathAbs(temp_prifit);
           //浮亏点数
           double lostPoint = (temp_prifit/ticket_Value)/temp_Lots;
           double  temp_price = Ask + NormalizeDouble((lostPoint + getProfitPoint) * Point,5);
           for (int index = OrdersTotal() - 1; index >= 0; index--){
              OrderSelect(index, SELECT_BY_POS, MODE_TRADES);
              if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != OP_BUY) continue;
              if(Ask >= temp_price){
                 OrderModify(OrderTicket(), OrderOpenPrice(), temp_price ,0,0,White);
              }else{
                 OrderModify(OrderTicket(), OrderOpenPrice(), 0 ,temp_price,0,White);  
              }
           }
        }
    }

    /**
        修改SELL单止盈
    */
    void alterGetProfitBySell(){
        //获取所有的手数
        double temp_Lots = getRealLotByType(OP_SELL);
        if(temp_Lots == 0){
           return ;
        }
        //获取所有的亏损记录
        double temp_prifit = getProfitBuyType(OP_SELL);
        //获取货币对的点值
        double ticket_Value = MarketInfo(Symbol(),MODE_TICKVALUE);
        if(temp_prifit < 0){
           temp_prifit =  MathAbs(temp_prifit);
           //浮亏点数
           double lostPoint = (temp_prifit/ticket_Value)/temp_Lots;
           double  temp_price = Bid - NormalizeDouble((lostPoint + getProfitPoint) * Point,5);
           for (int index = OrdersTotal() - 1; index >= 0; index--){
              OrderSelect(index, SELECT_BY_POS, MODE_TRADES);
              if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != OP_SELL ) continue;
              if(Bid <= temp_price){
                 OrderModify(OrderTicket(), OrderOpenPrice(), temp_price ,0,0,White);
              }else{
                 OrderModify(OrderTicket(), OrderOpenPrice(), 0 ,temp_price,0,White);  
              }
           }
        }
    }

    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
       {
        Print("hello word OnDeinit ");
       }

    int getFristOrder(int order_type){
        int ticketNo = -1;
        for(int i = OrdersTotal() - 1; i >= 0; i --){
           OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           //第一单大小等于开始单大小
           if(OrderLots() == starLotsSize && Symbol() == OrderSymbol()&& OrderType() == order_type && OrderMagicNumber() == MagicNumber){
              ticketNo = OrderTicket();
           }
        }
        return ticketNo;
    }
    //获取最后一单的ticket
    int getLastOrderByType(int opt_type)
    {
        double tempLot = 0;
        int retunTicket = -1;
        for(int i = OrdersTotal() - 1; i >= 0; i --)
        {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
           {
              if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == opt_type)
              {
                 if(OrderLots() > tempLot)
                 {
                    tempLot = OrderLots();
                    retunTicket = OrderTicket();
                   
                 }
              }
           }else {
              return -1;
           }
        }
        return retunTicket;
    }
    //获取当前品种单数
    int getEaSymbolTotal(int opt_type){
        double returnValue = 0;
        for(int i = OrdersTotal() - 1; i >= 0; i --) {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
           {
              if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType()== opt_type){
                 returnValue ++;
              }
           }else {
              return -1;
           }
        }
        return returnValue;
    }
    int start()
       {
       if(isWorked == false)return 0;
           checkFristOrder();
           openNextOrder();
           return 0;
       }
    //+------------------------------------------------------------------+
    /**获取买单或者卖单手数*/
    double getRealLotByType(int opt_type){
        double returnValue = 0;
        for(int index = OrdersTotal() - 1; index >= 0; index --)
        {
           OrderSelect(index, SELECT_BY_POS, MODE_TRADES);
           if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber ) continue;
              if(OrderType() == opt_type){
                 returnValue += OrderLots();
              }
        }
        return (returnValue);
    }

    /* 获取当前的账户盈亏金额*/
    double getProfitBuyType(int opt_type) {
        double returnValue = 0;
        for(int i =0; i< OrdersTotal(); i++){
           OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
           if(OrderSymbol()!= Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != opt_type)continue;
           else{
              returnValue = returnValue + OrderProfit() + OrderSwap()+ OrderCommission();
           }
        }
        return returnValue;
    }

    /*
        mType:BUY, SELL
        myLots: order size,example:0.01
        myLossStop: loss point
        myTakePoint: profit point
        return: int the order ticket.
    */
    int iOpenOrder(int myType, double myLots, int myLossStop, int myTakePoint)
    {
        ResetLastError();
        int returnValue = 0;
        int mySpread = MarketInfo(Symbol(), MODE_SPREAD);
       
        double BuyLossStop = Ask - myLossStop * Point;
        double BuyTakeProfit = Ask + myTakePoint * Point;
        double SellLossStop = Bid + myLossStop * Point;
        double SellTakeProfit = Bid - myTakePoint * Point;
       
        if(myLossStop <= 0)
        {
           BuyLossStop=0;
           SellLossStop = 0;
        }
       
        if(myTakePoint <= 0)
        {
           BuyTakeProfit= 0;
           SellTakeProfit = 0;
        }
        if(myType == OP_BUY)
        {
           returnValue = OrderSend(Symbol(), OP_BUY, myLots, Ask, mySpread, BuyLossStop, BuyTakeProfit, "联系方式 QQ:353666939", MagicNumber,0, Blue);
          
        }
        if(myType == OP_SELL)
        {
           returnValue = OrderSend(Symbol(), OP_SELL, myLots, Bid, mySpread, SellLossStop, SellTakeProfit, "联系方式 WX:N18616865140", MagicNumber,0, Red);
        }
       
        if(returnValue > -1)
        {
            isWorked = true;
        }
        Print(GetLastError());
        return returnValue;
    }
    /**
    关闭订单操作
    */
    bool iCloseOrder(int orderTicket, double orderLots,double price, int slippage, color clrOrder)
    {
        int i = 0;
        bool isClosed = false;
        while(i < 3)
        {
           ResetLastError();
           RefreshRates();
           isClosed = OrderClose(orderTicket, orderLots, price, slippage, clrOrder);
           if(isClosed == false)
           {
              PrintFormat("关闭时被服务器拒绝,订单号:%d, 原因:%d", orderTicket, GetLastError());
              i ++;
              Sleep(800);
           }else{
              break;
           }
        }
        return isClosed;
    }
    void closeAllOrderByType(int opt_type){
        for(int i = OrdersTotal()-1; i >=0; i --)
        {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
           {
              continue;
           }
           if(OrderSymbol() ==Symbol() &&  OrderMagicNumber() == MagicNumber && OrderType() == opt_type){
              color orderColor = clrBlue;
              if(OrderType() == OP_SELL) {
                 orderColor = clrRed;
              }
              RefreshRates();
              double closePrice = 0;
              int slippage = 3;
              if(OrderType() == OP_BUY)
                  closePrice = MarketInfo(OrderSymbol(), MODE_BID);
              else
                  closePrice = MarketInfo(OrderSymbol(), MODE_ASK);
                  iCloseOrder(OrderTicket(), OrderLots(),closePrice, slippage, orderColor);
           }
        }
    }
    double getProfitOrLot(string mType) {
        double returnValue = 0;
        for(int i =0; i< OrdersTotal(); i++){
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
           if(OrderSymbol()!= Symbol() || OrderMagicNumber() != MagicNumber)continue;
           else{
              if(mType == "Balance") returnValue = returnValue + OrderProfit() + OrderSwap()+ OrderCommission();
              if(mType == "Lot") returnValue = returnValue + OrderLots();
              }
           }
        }
        return (returnValue);
    }
    double getAllLots(){
        double returnValue = 0;
        for(int index = OrdersTotal() - 1; index >= 0; index --)
        {
           if(OrderSelect(index, SELECT_BY_POS, MODE_TRADES)){
           if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber ) continue;
           if(OrderType() ==OP_BUY){
                 returnValue += OrderLots();
           }else if(OrderType() == OP_SELL){
                 returnValue -= OrderLots();
           }
           }
        }
        return (returnValue);
    }

    void closeAllOrders(){
        for(int i = OrdersTotal()-1; i >=0; i --)
        {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
           {
              continue;
           }
           if(OrderSymbol() ==Symbol() &&  OrderMagicNumber() == MagicNumber){
              color orderColor = clrBlue;
              if(OrderType() == OP_SELL) {
                 orderColor = clrRed;
              }
              RefreshRates();
              double closePrice = 0;
              int slippage = 3;
              if(OrderType() == OP_BUY)
                  closePrice = MarketInfo(OrderSymbol(), MODE_BID);
              else
                  closePrice = MarketInfo(OrderSymbol(), MODE_ASK);
                  iCloseOrder(OrderTicket(), OrderLots(),closePrice, slippage, orderColor);
           }
        }
    }
      
    ""
    还没有人打赏,支持一下
    回复

    举报

     

    回答|共 82 个

    fxsinforex LV8

    发表于 2021-1-8 20:26:14 | 显示全部楼层

    谢谢

    vhbtkyno LV3

    发表于 2021-1-10 15:23:18 | 显示全部楼层

    谢谢

    create21 LV3

    发表于 2021-2-9 10:00:24 | 显示全部楼层

    顶下

    goldsoft8 LV3

    发表于 2021-2-12 20:25:31 | 显示全部楼层

    支持下

    汇财 LV2

    发表于 2021-2-15 17:57:27 | 显示全部楼层

    支持下

    sgnfwrfj LV3

    发表于 2021-2-24 21:56:42 | 显示全部楼层

    顶下

    昊茜妮hzb LV2

    发表于 2021-3-4 16:44:55 | 显示全部楼层

    顶下

    steven917 LV3

    发表于 2021-3-13 10:46:57 | 显示全部楼层

    顶下

    simon_lm91 LV3

    发表于 2021-3-16 15:48:28 | 显示全部楼层

    顶下
    您需要登录后才可以回帖 登录 | 注册

    提醒: 禁止引战、谩骂、灌水内容

    微信二维码

    有问题联系客服