planetcycles

Author: J.S. 2012
0 Views
0 Downloads
0 Favorites
planetcycles
//+------------------------------------------------------------------+
//|                                                 PlanetCycles.mq5 |
//|                                                        J.S. 2012 |
//|                                     http://www.eselstreckdich.de |
//+------------------------------------------------------------------+
#property copyright "J.S. 2012"
#property link      "http://www.eselstreckdich.de"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_label1  "PlanetCycle"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#include <SWISSEPH.mqh>

input bool Geocentric=true;  // geocentric view
input BODY fastPlanet=Moon;  // planet fast
input BODY slowPlanet=Sun;  // planet slow

//--- indicator buffers
double CycleBuffer[];
int flag=0;

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

   SetIndexBuffer(0,CycleBuffer,INDICATOR_DATA);
   
   flag=0;
   if(!Geocentric) flag=SEFLG_HELCTR;
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

   swe_close();
}

//+------------------------------------------------------------------+
//| 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 a[6], b[6];

   for( int i=prev_calculated; i<rates_total && !IsStopped(); i++) {
   
      calculate(time[i],fastPlanet,a,flag);
      calculate(time[i],slowPlanet,b,flag);
      
      if(Geocentric &&
         (slowPlanet==SE_SUN || slowPlanet==SE_MERCURY || slowPlanet==SE_VENUS) &&
         (fastPlanet==SE_SUN || fastPlanet==SE_MERCURY || fastPlanet==SE_VENUS)) {

         // z.B. Merkur bzw. Venus vor oder hinter der Sonne, Buch Seite 4
         CycleBuffer[i]=a[0]-b[0];
         while(CycleBuffer[i]>180) CycleBuffer[i]-=180;
         while(CycleBuffer[i]<-180) CycleBuffer[i]+=180;
         if(i>0 && CycleBuffer[i]-CycleBuffer[i-1]<-100) CycleBuffer[i]+=180;
         if(i>0 && CycleBuffer[i]-CycleBuffer[i-1]>100) CycleBuffer[i]-=180;
         
      } else {
      
         // Aspekte 0..180°, Buch Seite 15
         CycleBuffer[i]=a[0]-b[0];
         if(CycleBuffer[i]>360) CycleBuffer[i]-=360;
         if(CycleBuffer[i]<-360) CycleBuffer[i]+=360;
         if(CycleBuffer[i]>180) CycleBuffer[i]=360-CycleBuffer[i];
         if(CycleBuffer[i]<-180) CycleBuffer[i]=360+CycleBuffer[i];
         CycleBuffer[i]=MathAbs(CycleBuffer[i]);
      }
   }
   return(rates_total);
}

Comments