Come ottenere l'angolo di una media mobile? - pagina 2

 
Potrebbe per favore postare del codice con il contesto, dato che il mio codice continua a restituire un angolo di 0? Per esempio, trovare l'angolo di SMA 50 su 10 periodi.
 
jretzloff:
Potresti per favore postare del codice con il contesto, dato che il mio codice continua a restituire un angolo di 0? Per esempio, trovare l'angolo di SMA 50 su 10 periodi.
:) perché non posti il tuo codice continua a restituire un angolo di 0 per gli altri per aiutarti?
 
DxdCn:
jretzloff:
Potresti per favore postare del codice con il contesto dato che il mio codice continua a restituire un angolo di 0? Per esempio, trovare l'angolo di SMA 50 su 10 periodi.
:) perché non posti il tuo codice continua a restituire un angolo di 0 per gli altri per aiutarti?

Fondamentalmente, perché è pieno di merda che ho cercato di farlo funzionare. ..pieno di istruzioni di stampa, ecc. È un hack totale per cercare di testare il calcolo per un possibile uso nella visualizzazione in seguito. Comunque, eccolo qui:

//+------------------------------------------------------------------+
//|                                                  Angle of MA.mq4 |
//|                                Copyright © 2007,                 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007"
#property link      ""
 
#property indicator_separate_window
#property indicator_minimum -60.0
#property indicator_maximum 60.0
#property indicator_buffers 1
#property indicator_color1 Lime
#property indicator_width1 3
/*#property indicator_color2 Red
#property indicator_width2 3
*/
 
extern int MAPeriod = 50;
extern int SignalPeriod = 10;
 
double posAngle[], negAngle[];
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
 
   IndicatorBuffers(1);
   
   SetIndexBuffer(1, posAngle);
   //SetIndexStyle(1, DRAW_ARROW);
   SetIndexStyle(1, DRAW_HISTOGRAM);
   //SetIndexArrow(1, 110);
   SetIndexLabel(1, "Positive Angle");
   SetIndexEmptyValue(1, 0.0);
   
   /*SetIndexBuffer(2, negAngle);
   //SetIndexStyle(2, DRAW_ARROW);
   SetIndexStyle(2, DRAW_HISTOGRAM);
   //SetIndexArrow(2, 110);
   SetIndexLabel(2, "Negative Angle");
   SetIndexEmptyValue(2, 0.0);*/
   
   ArrayInitialize(posAngle, 0.0);
   //ArrayInitialize(negAngle, 0.0);
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   int counted_bars = IndicatorCounted();
   if(counted_bars < 0) 
       return(-1);
   if(counted_bars > 0) 
       counted_bars--;
   int limit = Bars - counted_bars; 
   
   double angle = 0.0;
   double price1 = 0.0, price2 = 0.0;
//----
   for(int x = 0; x < limit; x++) 
   {
      //if (x >= MAPeriods) 
      //{
         angle = 0.0;
         price1 = iMA(Symbol(),0,MAPeriod,0, MODE_SMA,PRICE_CLOSE,0);
         price2 = iMA(Symbol(),0,MAPeriod,SignalPeriod, MODE_SMA,PRICE_CLOSE,0);
         double test = (SignalPeriod-0.0)/WindowBarsPerChart();
         //Print("test: ", test);
         Print("Price1/2 ", price1, "/", price2, " angle->", angle);
         Print("price1-price2: ", price1-price2);
         //Print("WindowPriceMin(): ", WindowPriceMin());
         //Print("WindowPriceMax(): ", WindowPriceMax());
         //Print("WindowPriceMax()- WindowPriceMin(): ", WindowPriceMax()- WindowPriceMin());
         //Print("WindowBarsPerChart(): ", WindowBarsPerChart());
         //Print("SignalPeriod: ", SignalPeriod);
         //Print("(SignalPeriod-0)/WindowBarsPerChart()): ", (SignalPeriod-0.0)/WindowBarsPerChart());
         
         
         if (price1-price2 > 0)
            angle = MathArctan(MathTan(((price1-price2)/(WindowPriceMax()- WindowPriceMin()))/((SignalPeriod-0.0)/WindowBarsPerChart())))*180/3.14; 
         else
            angle = 0.0;
            
         Print("Angle > 0: ", angle>0.0);
         Print("Angle < 0: ", angle<0.0);
         
         if (angle > 0.0)
         {
            Print("+++++++++++++++++++ ANGLE +++++++++++++++++++");
            posAngle[x] = angle;
            //negAngle[x] = 0.0;
         }
         else if ( angle < 0.0)
         {
            Print("------------------- ANGLE -------------------");
            //negAngle[x] = angle;
            posAngle[x] = 0.0;  
         }
         else // some error occurred
         {
            Print("******************* ANGLE *******************");
            posAngle[x] = 0.0;
            //negAngle[x] = 0.0;
         }
         
      /*}
      else
      {
         posAngle[x] = 0.0;
         negAngle[x] = 0.0;
      }*/
      Print("posAngle[x]: ", posAngle[x]);
      Print("negAngle[x]: ", negAngle[x]);
      Print("Angle [", TimeToStr(Time[x], TIME_DATE|TIME_MINUTES), "] ---------------------------------------------> ", angle);
   }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Non c'è bisogno di così tanti cdes!
In cade:
MathArctan(MathTan(((prezzo1-prezzo2)/(WindowPriceMax()- WindowPriceMin()))/((SignalPeriod-0. 0)/WindowBarsPerChart())))*180/3.14;


Qual è il significato di "SignalPeriod" e perché?

Sai, generalmente, un angolo è la relazione tra una linea e l'asse X, quella linea è definita da due punti.
Nel tuo calcolo, prezzo2 e prezzo1 sono due valori alla stessa coordinata X,

Nella mia formula, utilizzate (delt Y) / (delt X) per calcolare l'angolo:
MathArctan(MathTan(
((prezzo1-prezzo2)/(WindowPriceMax()- WindowPriceMin()) // è delt Y
/
((shift2-shift1)/WindowBarsPerChart()) // è il delt X
))
*180/3.14

 

quali sarebbero i valori per shift1 e shift2? o da dove sono calcolati? so che questo è stato il mio problema ma non capisco come applicarlo con la media mobile.

 
qui, un angolo è la relazione tra una linea e gli assi X,
una linea è definita da due punti.
(prezzo1,shift1), (prezzo2,shift2) sono le coordinate di questi due punti.
---------------------------------------------------
altre parole, se hai bisogno di calcolare l'angolo di due linee qualsiasi, hai bisogno di 3 o 4 punti (due linee hanno bisogno di 3 o 4 punti per essere definite), e hai bisogno di più conoscenza delle funzioni trigonometriche.
dal tuo codice, immagino che tu voglia calcolare l'angolo di due linee qualsiasi (come due linee del MACD), non l'angolo di una linea e gli assi X.
Quindi hai bisogno di 3 o 4 punti, dovresti rivedere più conoscenza delle funzioni trigonometriche, forse la legge dei coseni.
--------------------------
Oppure, 1°, calcola ogni angolo di una delle linee e degli assi X, 2°, la loro differenza è l'angolo di quelle due linee.
 

grazie per la tua risposta, sto solo cercando di calcolare l'angolo di una singola linea, cioè una media mobile e l'asse x. so abbastanza di trigonometria per eseguire i calcoli, solo non con quello che è disponibile attraverso MT.

molto semplicemente, vorrei calcolare l'angolo corrente del MA allo shift 0 con il secondo punto di riferimento essendo il MA a SignalPeriod o MA a ? barre prima. l'altro punto di riferimento sarebbe l'intersezione dello shift 0 y e il SignalPeriod x.

 
Se è così, price2 dovrebbe cambiare in :
price2 = iMA(Symbol(),0,MAPeriod,0, MODE_SMA,PRICE_CLOSE,SignalPeriod);

La coordinata X (SignalPeriod) dovrebbe essere l'ultimo parametro della funzione iMA(....), non il quarto parametro. (4° parather: ma_shift è un altro significato, non usarlo se non sai cos'è !!!!)
Ora ok, prova di nuovo!
 
  Whats Wrong with this code ? ? ? 
  I am trying to 4 angles but I keep getting a divide 0 error ? 
  Thanks, 
  KK
  
 
  VectorPer = 16;
 
  HighStartPoint       = iHigh(Symbol(),0,VectorPer);
  PreviousBarHigh      = iHigh(Symbol(),0,SIGNALCANDLE+1);
  HighestPoint         = High[iHighest(Symbol(),0,MODE_HIGH,VectorPer,SIGNALCANDLE+1)];
  HighestAngle         = MathArctan(MathTan(((HighStartPoint-HighestPoint)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer-SIGNALCANDLE+1)/WindowBarsPerChart())))*180/3.14;
  PreviousHighBarAngle = MathArctan(MathTan(((HighStartPoint-PreviousBarHigh)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer-SIGNALCANDLE+1)/WindowBarsPerChart())))*180/3.14;
 
  pHighStartPoint       = iHigh(Symbol(),0,VectorPer+1);
  pPreviousBarHigh      = iHigh(Symbol(),0,SIGNALCANDLE+2);
  pHighestPoint         = High[iHighest(Symbol(),0,MODE_HIGH,VectorPer+1,SIGNALCANDLE+2)];
  pHighestAngle         = MathArctan(MathTan(((pHighStartPoint-pHighestPoint)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer+1-SIGNALCANDLE+2)/WindowBarsPerChart())))*180/3.14;
  pPreviousHighBarAngle = MathArctan(MathTan(((pHighStartPoint-pPreviousBarHigh)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer+1-SIGNALCANDLE+2)/WindowBarsPerChart())))*180/3.14;
  
  LowStartPoint        = iLow(Symbol(),0,VectorPer);
  PreviousBarLow       = iLow(Symbol(),0,SIGNALCANDLE);
  LowestPoint          = Low[iLowest(Symbol(),0,MODE_LOW,VectorPer,SIGNALCANDLE+1)];
  LowestAngle          = MathArctan(MathTan(((LowStartPoint-LowestPoint)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer-SIGNALCANDLE+1)/WindowBarsPerChart())))*180/3.14;
  PreviousLowBarAngle  = MathArctan(MathTan(((LowStartPoint-PreviousBarLow)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer-SIGNALCANDLE+1)/WindowBarsPerChart())))*180/3.14;
 
  pLowStartPoint        = iLow(Symbol(),0,VectorPer+1);
  pPreviousBarLow       = iLow(Symbol(),0,SIGNALCANDLE+2);
  pLowestPoint          = Low[iLowest(Symbol(),0,MODE_LOW,VectorPer,SIGNALCANDLE+2)];
  pLowestAngle          = MathArctan(MathTan(((pLowStartPoint-pLowestPoint)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer+1-SIGNALCANDLE+2)/WindowBarsPerChart())))*180/3.1415;
  pPreviousLowBarAngle  = MathArctan(MathTan(((pLowStartPoint-pPreviousBarLow)/(WindowPriceMax()- WindowPriceMin()))/((VectorPer+1-SIGNALCANDLE+2)/WindowBarsPerChart())))*180/3.1415;
 
Motivazione: