Mql5 功能,用于按票证、符号和交易方向选择未结订单

如何解决Mql5 功能,用于按票证、符号和交易方向选择未结订单

Mql5 的新手,需要一些帮助来处理这个 int Openorders() 最初来自 Mql4 EA 的代码,它可以找到未平仓头寸 -(如果有),并且最初通过 SYMBOL 进行选择,以及MAGIC Number,只要它在该符号上开立的交易尚未平仓,专家就不会开立任何其他头寸。 我希望 EA 识别它已打开的 TICKET、相关的 SYMBOLPOSITION_TYPE 以在 ONTICK 中使用,并且不在同一图表上打开任何其他交易,直到该头寸关闭,但可以继续在任何其他图表上交易。

input double LotSize    =0.3;
input double Incriment  =0.01;
input int    StopLoss   =50;
input int    TakeProfit =100;
input int    Trend     =21;
input int    Momentum  =21;
input int    Strength  =13;
int adxlevel       =34;
int buylevel       =62;
int selllevel      =36;
//---------------------
double pips;
#include <Trade\Trade.mqh>
CTrade Execute;
ulong passport,StopLevel;
double ask,bid;
double takeout=0,stopout=0;
int moving,rsi,adx,Spread;
//+------------------------------------------------------------------+
int OnInit()
  {
//---
      double ticksize = SymbolInfodouble(_Symbol,SYMBOL_POINT);
   if(_Digits==3||_Digits==4)
      pips=ticksize*1000;
   else
      pips =ticksize;
//---
        moving=iMA(_Symbol,PERIOD_CURRENT,Trend,MODE_SMA,PRICE_CLOSE);
        rsi=irsI(_Symbol,Momentum,PRICE_MEDIAN);
        adx=iADX(_Symbol,Strength);
//---
   return(INIT_SUCCEEDED);
  }
***int Openorders()
  {
      int   BUYS=0,SELLS=0;
         for(int i=0; i<PositionsTotal(); i++)
            {
               if(PositionSelectByTicket(passport)==false) break;
                  int dealtype=(int)PositionGetInteger(POSITION_TYPE); // buy or sell
//                  string position_symbol=PositionGetString(POSITION_SYMBOL); // chart symbol
               if(Symbol()==PositionGetSymbol(i) && passport==PositionGetTicket(POSITION_TICKET))
                  {
                     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)  BUYS++;
                     if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL) SELLS++;
                  }
            }      
//---       
      if(BUYS>0) return(BUYS);
      else       return(SELLS);
  }***
//+------------------------------------------------------------------+
void OnTick()
  {
//---       
            MqlRates rates[3];
            double movingarray[],rsiarray[],adxarray[];
            copyRates(_Symbol,1,3,rates);
            copyBuffer(rsi,rsiarray);
            copyBuffer(adx,adxarray);
            ask = SymbolInfodouble(_Symbol,SYMBOL_ASK);
            bid = SymbolInfodouble(_Symbol,SYMBOL_BID);
            Spread=int(SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
            StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TradE_STOPS_LEVEL);
//---
      if(Openorders()==0)
         {
               if(rates[0].open > moving )// CONDITION
               if(rsiarray[0] > buylevel && rsiarray[1] < buylevel )//SIGNAL
                  {
                     if(TakeProfit>0)  takeout=ask+TakeProfit*pips;
                        if(StopLoss>0)  stopout=ask-StopLoss*pips;
                           Execute.Buy(LotSize,NULL,ask,stopout,takeout,NULL);
                              passport=Execute.ResultOrder();
                              Print("BUY Opened");
                  }
               if(rates[0].open < moving )//CONTITION
               if(rsiarray[0] < selllevel &&rsiarray[1] > selllevel  )//SIGNAL
                  {
                     if(TakeProfit>0)  takeout=bid+TakeProfit*pips;
                        if(StopLoss>0)  stopout=bid-StopLoss*pips;
                           Execute.Sell(LotSize,bid,NULL);
                              passport=Execute.ResultOrder();
                              Print("SELL Opened");
                  }
          } 
//---
         if(Openorders()>0)
           {
            int dealtype=(int)PositionGetInteger(POSITION_TYPE);
                  if(dealtype==POSITION_TYPE_BUY)
                  if(rsiarray[0] < buylevel )
                    {
                     Execute.PositionClose(passport);
                        passport=0;
                    }
                    else if(dealtype==POSITION_TYPE_SELL)
                           if(rsiarray[0] > selllevel )
                             {
                              Execute.PositionClose(passport);
                                 passport=0;
                             }               
           }

  }

解决方法

我认为你真正想要的是:

input double LotSize    =0.3;
input double Incriment  =0.01;
input int    StopLoss   =50;
input int    TakeProfit =100;
input int    Trend     =21;
input int    Momentum  =21;
input int    Strength  =13;
int adxlevel       =34;
int buylevel       =62;
int selllevel      =36;
//---------------------
double pips;
#include <Trade\Trade.mqh>
CTrade Execute;
ulong StopLevel;
double ask,bid;
double takeout=0,stopout=0;
int moving,rsi,adx,Spread;
//+------------------------------------------------------------------+
int OnInit()
  {
//---
      double ticksize = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   if(_Digits==3||_Digits==4)
      pips=ticksize*1000;
   else
      pips =ticksize;
//---
        moving=iMA(_Symbol,PERIOD_CURRENT,Trend,MODE_SMA,PRICE_CLOSE);
        rsi=iRSI(_Symbol,Momentum,PRICE_MEDIAN);
        adx=iADX(_Symbol,Strength);
//---
   Execute.SetExpertMagicNumber(0xCAFE); // INCLUDED
   Execute.SetAsyncMode(false); // CHANGED
   return(INIT_SUCCEEDED);
  }
int OpenPositions(ulong &passport)
  {
      int   BUYS=0,SELLS=0;
         for(int i=0; i<PositionsTotal(); i++)
            {
              ulong ticket=PositionGetTicket(i); // changed
               if(PositionSelectByTicket(ticket)==false) break;
                  int dealtype=(int)PositionGetInteger(POSITION_TYPE); // buy or sell
//                  string position_symbol=PositionGetString(POSITION_SYMBOL); // chart symbol
               if(Symbol()==PositionGetSymbol(i) && 0xCAFE==PositionGetInteger(POSITION_MAGIC)) // CHANGED
                  {
                     passport = ticket; // CHANGED
                     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)  BUYS++;
                     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) SELLS++; // CHANGED
                  }
            }      
//---       
      if(BUYS>0) return(BUYS);
      else       return(SELLS);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
//---       
            MqlRates rates[3];
            double movingarray[],rsiarray[],adxarray[];
            CopyRates(_Symbol,1,3,rates);
            CopyBuffer(rsi,rsiarray);
            CopyBuffer(adx,adxarray);
            ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            Spread=int(SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
            StopLevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
//---
      ulong passport = 0; // CHANGED
      int positions = OpenPositions(passport); // CHANGED
      if(positions==0) // CHANGED
         {
               if(rates[0].open > moving )// CONDITION
               if(rsiarray[0] > buylevel && rsiarray[1] < buylevel )//SIGNAL
                  {
                     if(TakeProfit>0)  takeout=ask+TakeProfit*pips;
                     if(StopLoss>0)  stopout=ask-StopLoss*pips;
                     Execute.Buy(LotSize,NULL,ask,stopout,takeout,NULL);
                     Print("BUY Opened");
                  }
               if(rates[0].open < moving )//CONTITION
               if(rsiarray[0] < selllevel &&rsiarray[1] > selllevel  )//SIGNAL
                  {
                     if(TakeProfit>0)  takeout=bid+TakeProfit*pips;
                       if(StopLoss>0)  stopout=bid-StopLoss*pips;
                     Execute.Sell(LotSize,bid,NULL);
                     passport=Execute.ResultDeal(); // CHANGED
                     Print("SELL Opened");
                  }
          } 
         else if(positions>0) // CHANGED to prevent on the same tick do both
           {
            int dealtype=(int)PositionGetInteger(POSITION_TYPE);
                  if(dealtype==POSITION_TYPE_BUY)
                  if(rsiarray[0] < buylevel )
                    {
                     Execute.PositionClose(passport);
                    }
                    else if(dealtype==POSITION_TYPE_SELL)
                           if(rsiarray[0] > selllevel )
                             {
                              Execute.PositionClose(passport);
                             }               
           }
  }

我没有测试这些变化。而且大部分时间应该没问题。只有在延迟执行买入/卖出操作时才会出现问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?