82评论

2收藏

马丁源码

avatar WANGXIAOEA | 13320 人阅读 | 82 人评论 | 2020-12-31

#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 个

hlea

发表于 2020-12-31 12:17:46 | 显示全部楼层

fxsinforex

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

谢谢

vhbtkyno

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

谢谢

hdbaihaozi

发表于 2021-1-16 12:34:41 | 显示全部楼层

EAFX

发表于 2021-1-28 13:10:16 | 显示全部楼层

光光小仔

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

create21

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

顶下

goldsoft8

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

支持下

汇财

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

支持下

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

EA之家评论守则