MQL4 Expert面临问题的相关元引用

时间:2019-09-28 14:01:26

标签: mql4 metatrader4 mql

我遇到有关mql4元引号问题的问题,请在这里的任何人帮助我。

当我将其与指示器一起添加时,请检查下面的代码,它会破坏指示器中使用的某些功能,此外,该指示器还可以正常工作!

当我使用此连接器添加指示器时,它会中断许多检查,确保它们能正常工作而不是使用此连接器。

就像当我使用此连接器代码时,它会在每支蜡烛上发出警报一样,而不是此连接器可以正常工作,并且永远不会像这样破裂

谢谢!

#property description "MT2Trading connector: connects MT4 to MT2 Trading Platform"
#property link      "https://www.mt2trading.com"
#property version   "13.0"
#property strict
//#property icon "..\\Images\\mt2tradingplatform.ico"


enum broker {
   All = 0,
   IQOption = 1,
   Binary = 2,
   Spectre = 3,
   Alpari = 4
};

enum martingale {
   NoMartingale = 0,
   OnNextExpiry = 1,
   OnNextSignal = 2, 
   Anti_OnNextExpiry = 3, 
   Anti_OnNextSignal = 4, 
   OnNextSignal_Global=5,
   Anti_OnNextSignal_Global = 6
};

enum result {
   TIE = 0,
   WIN = 1,
   LOSS = 2
};

#import "mt2trading_library.ex4"   // Please use only library version 12.4 or higher !!!
   bool mt2trading  (string symbol, string direction, double amount, int expiryMinutes);
   bool mt2trading  (string symbol, string direction, double amount, int expiryMinutes, string signalname);
   bool mt2trading  (string symbol, string direction, double amount, int expiryMinutes, martingale martingaleType, int martingaleSteps, double martingaleCoef, broker myBroker, string signalName, string signalid);
   int  traderesult (string signalid);
#import


enum onoff {
   NO = 0,
   YES = 1 
};


// Inputs Parameters            
extern string s0 = "===== SIGNAL SETTINGS ============="; // ======================
static onoff AutoSignal = YES;     // Autotrade Enabled
extern broker Broker = All;
extern string SignalName = ""; // Signal Name (optional)
extern string IndicatorName = ""; // Indicator File Name
extern int IndiBufferCall = 0;      // Signal Buffer Up ("Call") 
extern int IndiBufferPut = 1;       // Signal Buffer Down ("Put") 
enum signaltype {
   IntraBar = 0,   // Intrabar
   ClosedCandle = 1       // On new bar
};
extern signaltype SignalType = ClosedCandle; // Entry Type
extern string s_title_settings   = "===== TRADING SETTINGS ============"; // ====================
extern double TradeAmount = 1;            // Trade Amount 
extern int ExpiryMinutes = 5;          // Expiry Time [minutes]
//extern string s_title_martingale = ""; // [Martingale Section]

extern martingale MartingaleType = NoMartingale; // Martingale
extern int MartingaleSteps = 2; // Martingale Steps          
extern double MartingaleCoef = 2.0; // Martingale Coefficient


// Variables          
bool Martingale;
string infolabel_names;
string chkenable;
bool infolabel_created;
int lbnum = 0;
bool initgui = false;

datetime sendOnce;   // Candle time stampe of signal for preventing duplicated signals on one candle
string asset;        // Symbol name (e.g. EURUSD)
string signalID;     // Signal ID (unique ID)
bool alerted = false;
int ForegroundColor;
long DesktopScaling; 
long desktopScreenDpi;
int  TerminalInfoInteger;




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{     

   // Initialize the time flag
   sendOnce = TimeCurrent();

   // Generate a unique signal id for signals management (based on timestamp, chart id and some random number)
   MathSrand(GetTickCount()); 
   if (MartingaleType == OnNextSignal || MartingaleType == Anti_OnNextSignal)
      signalID = IntegerToString(GetTickCount()) + IntegerToString(MathRand());   // For OnNextSignal martingale will be indicator-wide unique id generated
   else if (MartingaleType == OnNextSignal_Global || MartingaleType == Anti_OnNextSignal_Global) 
      signalID = IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN)) + IntegerToString(TerminalInfoInteger(TERMINAL_BUILD)) + AccountInfoString(ACCOUNT_NAME);   // For global martingale will be terminal-wide unique id generated     


   // Symbol name should consists of 6 first letters
   if (StringLen(Symbol()) >= 6)
      asset = StringSubstr(Symbol(),0,6);
   else
      asset = Symbol();


   // GUI
   desktopScreenDpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI);
   DesktopScaling = desktopScreenDpi > 96.0 ? desktopScreenDpi / 96.0 : 1.0;  
   ForegroundColor = ChartGetInteger(0, CHART_COLOR_FOREGROUND);
   for (int i = 0; i < 100; i++) {
      if (ObjectFind(0, "Obj_LB" + IntegerToString(i)) >= 0)
         continue;
      else {
         lbnum = i; 
         break;
      }
   }   
   infolabel_names = "Obj_LB" + IntegerToString(lbnum);   
   ObjectCreate(0, infolabel_names, OBJ_LABEL, 0, 0, 0); 
   ObjectSetText(infolabel_names,"", 8, "Tahoma");     
   chkenable = "Obj_CHK" + IntegerToString(lbnum);

   EventSetTimer(1);   
   return(INIT_SUCCEEDED);
}



void OnDeinit(const int reason)
{
   EventKillTimer();
   ObjectDelete(0, infolabel_names); 
   ObjectDelete(0, chkenable); 
}




//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- 
   double up = 0, dn = 0;
   ResetLastError();

   if (MartingaleType == NoMartingale || MartingaleType == OnNextExpiry || MartingaleType == Anti_OnNextExpiry)
      signalID = IntegerToString(GetTickCount()) + IntegerToString(MathRand());   // For NoMartingale or OnNextExpiry martingale will be candle-wide unique id generated

   if (IndicatorName != "") {
      up = iCustom(NULL, 0, IndicatorName, IndiBufferCall, SignalType);
      dn = iCustom(NULL, 0, IndicatorName, IndiBufferPut, SignalType);
   }
   else {
      ObjectSetText(infolabel_names,"MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + " Error: " + "Indicator name is EMPTY!", 8, "Tahoma", clrRed); 
   }

   // Check if iCustom is processed successful. If not: alert error once.
   int errornum = GetLastError();
   if (errornum == 4072) {
      ObjectSetText(infolabel_names,"MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + " Error: '" + IndicatorName+"' indicator is not found!", 8, "Tahoma", clrRed);  
      if (!alerted) {
         Alert("MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + " Connector Error: '" + IndicatorName+"' is not found in the indicators folder. Indicator name should match exactly with the indicator's file name.");
         alerted = true;
      }
   }

   // if signal UP (CALL)
   if (AutoSignal && signal(up) && Time[0] > sendOnce) {
      //Print(Time[0], sendOnce) ;
      mt2trading (asset, "CALL", TradeAmount, ExpiryMinutes, MartingaleType, MartingaleSteps, MartingaleCoef, Broker, SignalName, signalID);
      sendOnce = Time[0]; // Time stamp flag to avoid duplicated trades
      Print ("CALL - Signal sent!" + (Martingale != NoMartingale ? " [Martingale: Steps " + IntegerToString(MartingaleSteps) + ", Coefficient " + DoubleToString(MartingaleCoef,2) + "]" : ""));
   }

   // if signal DOWN (PUT)
   if (AutoSignal && signal(dn) && Time[0] > sendOnce) {
      //Print(Time[0], sendOnce) ;
      mt2trading (asset, "PUT", TradeAmount, ExpiryMinutes, MartingaleType, MartingaleSteps, MartingaleCoef, Broker, SignalName, signalID);
      Print ("PUT - Signal sent!" + (Martingale != NoMartingale ? " [Martingale: Steps " + IntegerToString(MartingaleSteps) + ", Coefficient " + DoubleToString(MartingaleCoef,2) + "]" : ""));
      sendOnce = Time[0]; // Time stamp flag to avoid duplicated trades
   }


   //--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+


// Function: check indicators signal buffer value 
bool signal (double value) 
{
   if (value != 0 && value != EMPTY_VALUE)
      return true;
   else
      return false;
} 









// Function: create info label on the chart
void OnTimer() {
   if (!initgui) {
      ObjectsDeleteAll(0,"Obj_*");      
      initgui = true;
   }
   createGUI();
}



void createGUI() {
      if (ObjectFind(0, infolabel_names) < 0) {
         int row = 0;
         for (int i = 0; i < 100; i++)
            if (ObjectFind(0, "Obj_LB" + IntegerToString(i)) >= 0)
               row++;
         ObjectCreate(0, infolabel_names,OBJ_LABEL, 0, 0, 0); 
         ObjectSetInteger(0,infolabel_names,OBJPROP_SELECTABLE,false);
         ObjectSetInteger(0,infolabel_names,OBJPROP_READONLY,true);
         ObjectSet(infolabel_names, OBJPROP_CORNER, 2);
         ObjectSet(infolabel_names, OBJPROP_XDISTANCE, 31*DesktopScaling);
         ObjectSet(infolabel_names, OBJPROP_YDISTANCE, 6*DesktopScaling + row * 16*DesktopScaling);
         ObjectCreate(ChartID(),chkenable,OBJ_LABEL,0,0,0) ;
         if (AutoSignal)
            ObjectSetText(chkenable,CharToStr(254),14,"Wingdings",ForegroundColor);
         else 
            ObjectSetText(chkenable,CharToStr(0x6F),14,"Wingdings",clrRed);

         ObjectSetInteger(0,chkenable,OBJPROP_SELECTABLE,false);
         ObjectSetInteger(0,chkenable,OBJPROP_READONLY,true);      
         ObjectSet(chkenable, OBJPROP_CORNER, 2);


         ObjectSetInteger(ChartID(),chkenable,OBJPROP_XDISTANCE,10*DesktopScaling);
         ObjectSetInteger(ChartID(),chkenable,OBJPROP_YDISTANCE,2*DesktopScaling + row*16*DesktopScaling);
         ObjectSetInteger(ChartID(),chkenable,OBJPROP_BACK,false);
         ObjectSetInteger(ChartID(),chkenable,OBJPROP_XSIZE,7*DesktopScaling);
         ObjectSetInteger(ChartID(),chkenable,OBJPROP_YSIZE,7*DesktopScaling);   
         if (IndicatorName=="") {
            Alert ("Attention: Indicator is not defined.");      
            Print ("Attention: Indicator is not defined.");    
            ObjectSetText(infolabel_names,"MT2" +"MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + " Error: " + "Indicator name is EMPTY!", 8, "Tahoma", clrOrangeRed);  
         }   
         else 
            if (AutoSignal)
               ObjectSetText(infolabel_names,"MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + ": " + IndicatorName + " ["+ DoubleToString(TradeAmount,2) + " | Exp: " + IntegerToString(ExpiryMinutes)+ "M]", 8, "Tahoma", ForegroundColor);     
            else
               ObjectSetText(infolabel_names,"MT2" + (Broker == IQOption ? "IQ" : Broker == Binary ? "Binary" : Broker == Spectre ? "Spectre" : Broker == Alpari ? "ALP" : "") + ": " + IndicatorName + " ["+ DoubleToString(TradeAmount,2) + " | Exp: " + IntegerToString(ExpiryMinutes)+ "M]", 8, "Tahoma", clrRed);     
      }
}



void OnChartEvent(const int id,         // Event ID 
                  const long& lparam,   // Parameter of type long event 
                  const double& dparam, // Parameter of type double event 
                  const string& sparam  // Parameter of type string events 
                  ) 
{ 
   if (id == CHARTEVENT_OBJECT_CLICK) {
      if(sparam==chkenable)
      {
         if (AutoSignal) {
            AutoSignal = NO;
            ObjectSetText(chkenable,CharToStr(0x6F),14,"Wingdings",clrRed);
            ObjectSetInteger(0, infolabel_names, OBJPROP_COLOR, clrRed);
         } 
         else {
            AutoSignal = YES;
            ObjectSetText(chkenable,CharToStr(254),14,"Wingdings",ForegroundColor);         
            ObjectSetInteger(0, infolabel_names, OBJPROP_COLOR,ForegroundColor);
         }
      }

   }
}```


0 个答案:

没有答案