初学者的问题 MQL5 MT5 MetaTrader 5 - 页 812

 

这怎么可能呢? 难道数学没有问题吗?

input double    T_P  =0.81;
input double    S_L  =0.35;

b_ep=price-atrH1200;
b_sl=b_ep-(b_ep*S_L)/100;
b_tp=b_ep+(b_ep*T_P)/100;

它看起来像1.05 *0.81/100 =0.008505

它给你35%的止损和81%的利润,而不是0.81%和0.35%。

SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");

BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");

来自标准SellLimit&BuyLimit 的方法


Print(s_ep,"s_ep");
Print(s_sl,"s_sl");
Print(s_tp,"s_tp");

印刷品显示。

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp


 
SILVERPRINT:

这怎么可能呢? 难道数学没有问题吗?

它看起来像1.05 *0.81/100 =0.008505

它给你35%的止损和81%的利润,而不是0.81%和0.35%。

来自标准SellLimit&BuyLimit 的方法


印刷品显示。

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp



重写同样的代码,但要让所有的变量都被声明。我看看你申报的是什么类型的变量。然后,正确的解决方案就近在眼前。

 
Vladimir Karputov:

重写同样的代码,但要让所有的变量都被声明。我看看你申报的是什么类型的变量。然后你就会走上正确的解决途径。


//+------------------------------------------------------------------+
//|                                                       |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Indicators\Trend.mqh>
#include <Indicators\Oscilators.mqh>
#include <Indicators\TimeSeries.mqh>
#include <Trade\Trade.mqh>
input double    T_P  =0.81;
input double    S_L  =0.35;
static int hour;
int h;
input int TIME_FOR_ACTION=16;
input int slowma=200;
input int fastwma=20;
input int mahours=20;
input double LOT_FOR_TRADE=0.1;
string symb;
MqlTick infotick;
MqlDateTime currentTime;
CiMA ValueofMA200;
CiMA ValueofMA20;
CiMA ValueofMAHour;
CiATR atr;
CTrade T_M;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   symb=_Symbol;
   ValueofMA200.Create(symb,PERIOD_D1,slowma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMA20.Create(symb,PERIOD_D1,fastwma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMAHour.Create(symb,PERIOD_H1,mahours,0,MODE_SMA,PRICE_CLOSE);
   atr.Create(symb,PERIOD_H1,200);


   atr.BufferResize(40);
   ValueofMA200.BufferResize(250);
   ValueofMA20.BufferResize(250);
   ValueofMAHour.BufferResize(250);

   T_M.LogLevel(LOG_LEVEL_ALL);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   RefCustom();
   SymbolInfoTick(symb,infotick);
   TimeToStruct(infotick.time,currentTime);

   if(1==1)
     {
      if(1==1)
        {
         double maD1200,maD120,maH120,atrH1200,price;

         maD1200=ValueofMA200.Main(0);
         maD120=ValueofMA20.Main(0);
         maH120=ValueofMAHour.Main(0);
         atrH1200=atr.Main(0);
         price=infotick.bid;
         double s_ep,s_sl,s_tp;
         double b_ep,b_sl,b_tp;


         if(1==1)
           {
            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;
            T_M.BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");
           }
         if(1==1)
           {
            s_ep=price+atrH1200;
            s_sl=s_ep+(s_ep*S_L)/100;
            s_tp=s_ep-(s_ep*T_P)/100;

            T_M.SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");
           }
}

     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+
void RefCustom()
  {
   ValueofMA200.Refresh();
   ValueofMA20.Refresh();
   ValueofMAHour.Refresh();
   atr.Refresh();
  }
//+------------------------------------------------------------------+

 
SILVERPRINT:


错了。不编译。

 
Vladimir Karputov:

错了。它不会被编译。


对不起,现在试试。

 
SILVERPRINT:

对不起,现在试试。


可能是一夜之间 - 所以我完全不明白你想做什么。

一句话的建议。

  • 宣告时,将变量INITIALIZE化。
  • 除法时,要用双数除法,不要用英数除法(例如,数字100.0->双数,数字100->英数)。
  • 这个样式是什么,如果(1==1)-?这是很畸形的,千万不要这样写。
  • 最后,最重要的是,在你的代码中只留下三行。

            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;

  • 并明确地声明和初始化变量。比如说像这样。

   double price=1.05848;
   double atrH1200=1.05168;
   double T_P=0.81;
   double S_L=0.35;

   double b_ep=price-atrH1200;
   double b_sl=b_ep-(b_ep*S_L)/100.0;
   double b_tp=b_ep+(b_ep*T_P)/100.0;
   DebugBreak();
 
Vladimir Karputov:

可能是一夜之间 - 所以我不明白你想做的任何事情。

一句话的建议。

  • 在声明INITIALIZE变量时
  • 除法时,要用双数除法,不要用英数除法(例如,数字100.0->双数,数字100->英数)。
  • 这个样式是什么,如果(1==1)-?这是很畸形的,千万不要这样写。
  • 最后,最重要的是,在你的代码中只留下三行。

  • 并明确地声明和初始化变量。比如说像这样。


谢谢你令人难以置信的帮助。

 
奇怪的是,即使有多于零的订单,该函数也能工作。
if(OrdersTotal()==0)

这并没有什么区别,但在功能不工作的地方,可能会打开整个存款。

 
SILVERPRINT:
奇怪的是,这个函数,即使有多于零的订单也能工作。

这并没有什么区别,但在功能不工作的地方,它可以打开整个存款。

打开MT5功能的帮助,确保你正确理解MT5中的订单是什么。

 
按了又按F1,找不到...

请告诉我如何确定另一个字符的_Digits?