Programmazione MQL4

corfurio

Nuovo Utente
Registrato
7/3/15
Messaggi
39
Punti reazioni
0
Salve,
apro nuova discussione generica così possono accodarsi anche altre persone se magari sono interessate;
Sto cercando di inserire una linea verticale sul mio indicatore ma non ci riesco, la OBJ_VLINE, necessita esclusivamente del dato "orario" siccome in funziona a quell' ora andrà poi a tracciare la linea, nel mio caso chiaramente, siccome non mi interessa sia in modalità "move", sapete dirmi cosa sto omettendo perchè proprio non ci arrivo.
Grazie

Io ho questa porzione di codice, il delete è in fondo qui non e presente;
**ho messo timecurrent(), siccome non so come inserire un dato orario, io ci ho provato con: '2015.12.07 11:30' ma non lo accetta

Codice:
const string name="VLineOpen"; // nome della linea
   datetime time=TimeCurrent(); // orario della linea
   const color clr=clrRed; 
   const ENUM_LINE_STYLE style=STYLE_SOLID; // stile della linea
   const int width=1; // spessore della linea
   const bool back=false; // in sottofondo
 
Risolto, ora la imposto dal menù dell' indicatore.
La parte "move" ancora non so come impostarla, ma per il momento non mi serve

extern datetime VlineIngresso="";

if (ObjectFind("vline_ingresso") != 0)
{
ObjectCreate("vline_ingresso",OBJ_VLINE,0,VlineIngresso,0);
ObjectSet("vline_ingresso",OBJPROP_COLOR,Red);
ObjectSet("vline_ingresso",OBJPROP_WIDTH,1);
ObjectSet("vline_ingresso",OBJPROP_STYLE,2);
}
else
{
ObjectMove("vline_ingresso", 0,VlineIngresso,0);
}
 
Ciao, chiedo un supporto tecnico per una formula, relativa allo scostamento del sottostante, in termini di PIPS, di seguito la formula.
Praticamente la formula funziona correttamente, ma essendoci MATHABS prendo sempre il valore assoluto ed il segno meno sparisce, potete dirmi come fare per avere anche il segno negativo (-) quando i pips di scostamento sono negativi?

Codice:
double scm=(DoubleToStr(100*(MathAbs(MonthClPrice-MonthOpPrice)/MonthOpPrice),2)+"%");
   double scs=(DoubleToStr(100*(MathAbs(WeekClPrice-WeekOpPrice)/WeekOpPrice),2)+"%");
   double scg=(DoubleToStr(100*(MathAbs(DayClPrice-DayOpPrice)/DayOpPrice),2)+"%");


Sempre su questa formula ho un problema legato al decimali, 50 pips di movimento vengono scritti con 500, 1 pips viene scritto come 10, se il broker mi da decimi di pips devo considerare che 1 pips=10 decimi di pips, io NON so come aggiungere la regola, se cè qualche anima candida fra di voi ne sarei grato
 
Ciao, chiedo un supporto tecnico per una formula, relativa allo scostamento del sottostante, in termini di PIPS, di seguito la formula.
Praticamente la formula funziona correttamente, ma essendoci MATHABS prendo sempre il valore assoluto ed il segno meno sparisce, potete dirmi come fare per avere anche il segno negativo (-) quando i pips di scostamento sono negativi?

Codice:
double scm=(DoubleToStr(100*(MathAbs(MonthClPrice-MonthOpPrice)/MonthOpPrice),2)+"%");
   double scs=(DoubleToStr(100*(MathAbs(WeekClPrice-WeekOpPrice)/WeekOpPrice),2)+"%");
   double scg=(DoubleToStr(100*(MathAbs(DayClPrice-DayOpPrice)/DayOpPrice),2)+"%");


Sempre su questa formula ho un problema legato al decimali, 50 pips di movimento vengono scritti con 500, 1 pips viene scritto come 10, se il broker mi da decimi di pips devo considerare che 1 pips=10 decimi di pips, io NON so come aggiungere la regola, se cè qualche anima candida fra di voi ne sarei grato

Se usi la funzione MathAbs significa che hai bisogno del valore assoluto, se non lo vuoi, (così come sembra di capire da quanto scrivi) basta eliminarla dalla formula; inoltre, c'è un errore implicito nella formula che usi: ti serve una valore stringa o un double?
Se, da come credo di aver capito, ti serve una stringa che poi attaccherai da qualche parte sul grafico, è meglio che scrivi così:
Codice:
string scg=DoubleToStr(100*((iClose(Symbol(),PERIOD_D1,0)-iOpen(Symbol(),PERIOD_D1,0))/iOpen(sym,PERIOD_D1,0)),2)+"%";

Ciao
 
Sempre su questa formula ho un problema legato al decimali, 50 pips di movimento vengono scritti con 500, 1 pips viene scritto come 10, se il broker mi da decimi di pips devo considerare che 1 pips=10 decimi di pips, io NON so come aggiungere la regola, se cè qualche anima candida fra di voi ne sarei grato

Inserisci questa funzione nel tuo codice:
Codice:
extern string sym="USDJPY";
double MyPoint()
{
   int digits=MarketInfo(sym,MODE_DIGITS);
   string point=DoubleToStr(MarketInfo(sym, MODE_POINT),digits);
   if (point=="0.00001")
   {
      return(0.0001);
   }
   else
   {
      if(point=="0.001")
      {
         return(0.01);
      }
      else
      {
         return(Point);
      }
   }
}

e poi, ad esempio, se vuoi calcolare la differenza in pips tra apertura e chiusura, ti basta fare così:
Codice:
string pipdiff =DoubleToStr((iClose(sym,PERIOD_D1,0)-iOpen(sym,PERIOD_D1,0))/MyPoint(),0);

Ciao
 
Inserisci questa funzione nel tuo codice:
Codice:
extern string sym="USDJPY";
double MyPoint()
{
   int digits=MarketInfo(sym,MODE_DIGITS);
   string point=DoubleToStr(MarketInfo(sym, MODE_POINT),digits);
   if (point=="0.00001")
   {
      return(0.0001);
   }
   else
   {
      if(point=="0.001")
      {
         return(0.01);
      }
      else
      {
         return(Point);
      }
   }
}

e poi, ad esempio, se vuoi calcolare la differenza in pips tra apertura e chiusura, ti basta fare così:
Codice:
string pipdiff =DoubleToStr((iClose(sym,PERIOD_D1,0)-iOpen(sym,PERIOD_D1,0))/MyPoint(),0);

Ciao


Ciao!!


In merito a questa stringa che ho messo in cima sai dirmi cosa è siccome ho visto che mi escono gli scostamenti pips solo di questo cambio, anche se apro altri grafici;
Codice:
extern string sym="USDJPY";


Queste formule calcolano la percentuale di scostamento e i range di pips (mese/settimana/giorno) Seguendo il tuo consiglio ho tolto mathabs ed ora escono anche i negativi, rimane il problema del jpy sulla %, che non esce, ed il perche gli scostamenti di pips segnano solo quelli del cambio USDJPY.

Codice:
 double scm=(DoubleToStr(100*((MonthClPrice-MonthOpPrice)/MonthOpPrice),2)+"%");
   double scs=(DoubleToStr(100*((WeekClPrice-WeekOpPrice)/WeekOpPrice),2)+"%");
   string scg=(DoubleToStr(100*((DayClPrice-DayOpPrice)/DayOpPrice),2)+"%");
   
   double range_m=(DoubleToStr(MathPow(10,Digits)*(MonthClPrice-MonthOpPrice),0));
   double range_s=(DoubleToStr(MathPow(10,Digits)*(WeekClPrice-WeekOpPrice),0));
   string range_g =DoubleToStr((iClose(sym,PERIOD_D1,0)-iOpen(sym,PERIOD_D1,0))/MyPoint(),0);

Ciao Grazie
 
Ultima modifica:
Se usi la funzione MathAbs significa che hai bisogno del valore assoluto, se non lo vuoi, (così come sembra di capire da quanto scrivi) basta eliminarla dalla formula; inoltre, c'è un errore implicito nella formula che usi: ti serve una valore stringa o un double?
Se, da come credo di aver capito, ti serve una stringa che poi attaccherai da qualche parte sul grafico, è meglio che scrivi così:
Codice:
string scg=DoubleToStr(100*((iClose(Symbol(),PERIOD_D1,0)-iOpen(Symbol(),PERIOD_D1,0))/iOpen(sym,PERIOD_D1,0)),2)+"%";

Ciao

Con questa formula che ripeto, adesso a terminale funziona, a grafico da problemi, perchè non si muove coerentemente in funzione allo spostamento del prezzo, è sempre su valori tipo 0,001, o 0,002 % non so come mai.
Sia questa formula che quella vecchia che usavo (NON ANDAVA SUI CAMBI JPY) non vanno sul cambio JPY. quella vecchia va ebne su tutto tranne, li, quella nuova non so ma rimane su valori minuscoli.
 
Prego ;)

sym sta ad indicare il simbolo dal quale vuoi estrapolare i dati (potrebbe interessarti l'apertura di USDJPY mentre sei sul grafico diAUDUSD, ad esempio).
Codice:
extern string sym="";
int OnInit()
{
   if(sym=="")
   {
      sym=Symbol();
   }
   return(INIT_SUCCEEDED);
}
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[])
{
   string scm=DoubleToStr(100*((iClose(sym,PERIOD_MN1,0)-iOpen(sym,PERIOD_MN1,0))/iOpen(sym,PERIOD_MN1,0)),2)+"%";
   string scs=DoubleToStr(100*((iClose(sym,PERIOD_W1,0)-iOpen(sym,PERIOD_W1,0))/iOpen(sym,PERIOD_W1,0)),2)+"%";
   string scg=DoubleToStr(100*((iClose(sym,PERIOD_D1,0)-iOpen(sym,PERIOD_D1,0))/iOpen(sym,PERIOD_D1,0)),2)+"%";
   string range_m=DoubleToStr((iClose(sym,PERIOD_MN1,0)-iOpen(sym,PERIOD_MN1,0))/MyPoint(),0);
   string range_s=DoubleToStr((iClose(sym,PERIOD_W1,0)-iOpen(sym,PERIOD_W1,0))/MyPoint(),0);
   string range_g =DoubleToStr((iClose(sym,PERIOD_D1,0)-iOpen(sym,PERIOD_D1,0))/MyPoint(),0);
   return(rates_total);
}
double MyPoint()
{
   int digits=MarketInfo(sym,MODE_DIGITS);
   string point=DoubleToStr(MarketInfo(sym, MODE_POINT),digits);
   if (point=="0.00001")
   {
      return(0.0001);
   }
   else
   {
      if(point=="0.001")
      {
         return(0.01);
      }
      else
      {
         return(Point);
      }
   }
}
In questo modo, se quando carichi l'indicatore non imposti il valore di "sym", allora questo assumerà il valore che identifica il simbolo sul cui grafico lo avrai caricato, (ciò avviene all'inizializzazione dell'indicatore nella funzione OnInit())
Per il resto, non so perché utilizzi l'elevazione a potenza per determinare il range in pips tra due valori.

Ciao
 
Grandissimo, ora il range-pips è corretto su tutti i tempi.
Mentre se metto la formula sullo scostamento percentuale non mi calcola i valori corretti, rimane sempre su 0.11 0.12 % su tutti i cambi, e lo JPY non lo prende ancora, mentre quella dei pips è fantastica ora fa esattamente tutto anche sui cambi JPY.

Non riesco a trovare l' errore che sicuramente ho commesso sulla gestione delle scadenze, o meglio, va tutto bene SE non supero 1 giorno di scadenza, ma se faccio 2-3 giorni il conto alla rovescia si ferma sempre sui 23 ore;
Con il bool decido se attivare o meno le varie scadenze e qui va tutto bene;

Codice:
 input bool TimerScadenze=false;
   input bool ScadenzeCall=false;
   extern datetime CallV="";
   extern datetime CallC="";
   input bool ScadenzePut=false;
   extern datetime PutV="";
   extern datetime PutC="";

E qui ci sono le varie regole/formule utilizzo TimeLocal meno la mia scadenza che inserisco quando avvio l' indicatore;

Codice:
 string scad_PC_PV;
   double scad_P_C=+TimeToStr (PutC - TimeLocal() + (( 0 - timezone) * 3600), TIME_MINUTES | TIME_SECONDS);
   double scad_P_V=+TimeToStr (PutV - TimeLocal() + (( 0 - timezone) * 3600), TIME_MINUTES | TIME_SECONDS);
   ObjectCreate("scad_PC_PV",OBJ_LABEL,0,1,4);
   ObjectSetText("scad_PC_PV","P|C  "+TimeToStr (PutC - TimeLocal() + (( 0 - timezone) * 3600), TIME_MINUTES | TIME_SECONDS)+"  -   P|V  " +TimeToStr (PutV - TimeLocal() + (( 0 - timezone) * 3600), TIME_MINUTES | TIME_SECONDS) +"",10,"Calibri",clrWhite);
   ObjectSet("scad_PC_PV",OBJPROP_XDISTANCE,2);
   ObjectSet("scad_PC_PV",OBJPROP_YDISTANCE,253);
   ObjectSet("scad_PC_PV",OBJPROP_CORNER,4);
   ObjectSetInteger(cid,"scad_PC_PV",OBJPROP_SELECTABLE,false);

Ho risolto l' altro problema, ho finito praticamente! Manca solo il problemino con la formula % sul jpy, e la scadenza
= sono stanco =D

Domanda, con la funzione qui sotto, posso mettere quando avvio l' indicatore dei dati nella sua casella, però se lo faccio NON LI TROVO SULLA CHART, io uso sempre objectcreate, cosa sbaglio?

Codice:
"extern string testo="";
   ObjectSetText("delta",+DoubleToStr([B]testo[/B]),10,"Times New Roman",Red);
   ObjectSet("delta",OBJPROP_XDISTANCE, 50);
   ObjectSet("delta",OBJPROP_YDISTANCE, 195);
   ObjectSet("delta",OBJPROP_CORNER,4); 
   ObjectSet("delta",OBJPROP_BACK,false);
   ObjectSetInteger(cid,"delta",OBJPROP_SELECTABLE,false);,OBJPROP_SELECTABLE,false);



Grazie come sempre, sei il numero 1
 
Ultima modifica:
Indietro