Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 812

 

Com'è possibile? Non c'è stato un problema con la matematica?

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;

Sembra che 1,05 *0,81/100 =0,008505

Ti dà il 35% di stop e l'81% di tekprofit invece di 0,81% e 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");

Il metodo della libreria standardSellLimit&BuyLimit


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

La stampa mostra:

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:

Com'è possibile? Non c'è stato un problema con la matematica?

Sembra che 1,05 *0,81/100 =0,008505

Ti dà il 35% di stop e l'81% di tekprofit invece di 0,81% e 0,35%

Il metodo della libreria standardSellLimit&BuyLimit


La stampa mostra:

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



Riscrivete lo stesso codice, ma in modo che TUTTE le variabili siano dichiarate. Vedrò quali tipi di variabili dichiara. E poi la soluzione giusta è a portata di mano.

 
Vladimir Karputov:

Riscrivete lo stesso codice, ma in modo che TUTTE le variabili siano dichiarate. Vedrò quali tipi di variabili dichiara. E poi sarete sulla strada della soluzione giusta.


//+------------------------------------------------------------------+
//|                                                       |
//|                        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:


Errori. Non si compila.

 
Vladimir Karputov:

Errori. Non si compila.


Scusa, prova ora.

 
SILVERPRINT:

Scusa, prova ora.


Probabilmente da un giorno all'altro - quindi non capisco affatto COSA stai cercando di fare.

Un consiglio:

  • INITIALIZZARE le variabili quando si dichiara
  • quando si divide, dividere per doppio, non per int (es. numero 100.0 -> doppio, numero 100 -> int)
  • cos'è questo stile if(1==1) - ? Questo è mostruoso, non scrivere mai così.
  • Per ultimo, il più importante, lasciate solo tre linee nel vostro codice,

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

  • e dichiarare e inizializzare le variabili in modo esplicito. Per esempio così:

   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:

Probabilmente durante la notte - quindi non capisco NULLA di quello che stai cercando di fare.

Un consiglio:

  • INITIALIZZARE le variabili quando si dichiara
  • quando si divide, dividere per doppio, non per int (es. numero 100.0 -> doppio, numero 100 -> int)
  • cos'è questo stile if(1==1) - ? Questo è mostruoso, non scrivere mai in questo modo.
  • Per ultimo, il più importante, lasciate solo tre linee nel vostro codice,

  • e dichiarare e inizializzare le variabili in modo esplicito. Per esempio così:


Grazie, incredibilmente utile.

 
Stranamente, la funzione funziona anche se ci sono più ordini di zero.
if(OrdersTotal()==0)

Non fa moltadifferenza, ma dove la funzione non funziona, può aprire l'intero deposito.

 
SILVERPRINT:
Strano ma la funzione funziona anche se ci sono più ordini di zero.

Non fa moltadifferenza, ma dove la funzione non funziona può aprire l'intero deposito.

Aprite l'aiuto di MT5 per la funzione e assicuratevi di aver capito correttamente cos'è un ordine in MT5

 
Ho premuto e premuto F1, non ho trovato...

Potete dirmi per favore come determinare _Digit per un altro carattere?