|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Custom-Indikator lässt MT4 einfrieren
Hallo.
Ein Eigener Indi lässt immer wieder den MT4 einfrieren. Dass er 6 Buffer hat, sollte ja eigentlich egal sein. Ist Im Anhang. Hab schon Vieles geändert, immer das gleiche Problem. Der eigene Indi im Anhang mit 4 Buffern ist im Grunde genauso, funktioniert aber ohne Probleme. Code:
//============================================================================= #property version "OdHML_6B_SEP_v2.mq4" #property description "erst mal keine" #property link "daniel-rudloff@web.de" //============================================================================= #property indicator_separate_window// Unterfenster #property indicator_buffers 6 #property indicator_color1 clrGreen// Farbe der Linie #property indicator_width1 1 #property indicator_color2 clrOrange// Farbe der Linie #property indicator_width2 1 #property indicator_color3 clrPaleGreen// Farbe der Linie #property indicator_width3 1 #property indicator_color4 clrPaleGreen// Farbe der Linie #property indicator_width4 1 #property indicator_color5 clrRed// Farbe der Linie #property indicator_width5 1 #property indicator_color6 clrGreen// Farbe der Linie #property indicator_width6 1 //============================================================================= //============================================================================================================= // G L O B A L E E I N S T E L L U N G E N //============================================================================================================= extern int MA_Hi_Period = 6;// Zum Testen 6 extern int MA_Hi_ChartShift = 0; input ENUM_MA_METHOD MA_Hi_Method = MODE_SMA; input ENUM_APPLIED_PRICE Price_Mi=PRICE_CLOSE; extern int MA_Mi_Period = 6;// Zum Testen 6 extern int MA_Mi_ChartShift = 0; input ENUM_MA_METHOD MA_Mi_Method = MODE_SMA; input ENUM_APPLIED_PRICE MA_Mi_Price = PRICE_CLOSE; extern int MA_Lo_Period = 6;// Zum Testen 6 extern int MA_Lo_ChartShift = 0; input ENUM_MA_METHOD MA_Lo_Method = MODE_SMA; //============================================================================================================= // G L O B A L E D E K L A //============================================================================================================= //============================================================================================================= string IndisName = "OdHML_6B_SEP"; // Indikatorname //------------------------------------------------------------------------------------------------------------- double Pr_Hi,Pr_Op,Pr_Cl,Pr_Lo,Pr_ME,Pr_TY,Pr_WE, hiPR,miPR,loPR, hiMA,miMA,loMA, OD_hiPR,OD_hiMA, OD_miPR,OD_miMA, OD_loPR,OD_loMA, BUF_A[]// Buffer 0 , BUF_B[]// Buffer 1 , BUF_C[]// Buffer 2 , BUF_D[]// Buffer 3 , BUF_E[]// Buffer 4 , BUF_F[]// Buffer 5 ; //------------------------------------------------------------------------------------------------------------- int i ; //============================================================================================================= // O P Z D I V //============================================================================================================= double ODIV( double ODIV_ToDiv// Soll dividiert werden , double ODIV_Div// Wert, der kleiner als 1.0 ist ){ double ODIV_DIV_mt , ODIV_DivEd , ODIV_DivEd_t; int ODIV_mt; if( ODIV_Div <= -1.0 || ODIV_Div >= 1.0 )ODIV_DivEd = ODIV_ToDiv / ODIV_Div; if( ODIV_Div > -1.0 && ODIV_Div < 1.0 ){ ODIV_mt=0; while( ODIV_Div > -1.0 && ODIV_Div < 1.0 ){ ODIV_DIV_mt = ODIV_Div * 10.0; ODIV_Div = ODIV_DIV_mt; ODIV_mt++;} ODIV_DivEd = ODIV_ToDiv / ODIV_DIV_mt; for( ODIV_mt ; ODIV_mt > 1 ; ODIV_mt-- ){ ODIV_DivEd_t = ODIV_DivEd * 10.0; ODIV_DivEd = ODIV_DivEd_t;} } return ODIV_DivEd; } //============================================================================================================= // O P Z M U L //============================================================================================================= double OMUL( double OMUL_ToMul// Soll multipliziert werden , double OMUL_Mul// Wert, der kleiner als 1.0 ist ){ double OMUL_MUL_mt , OMUL_MulEd , OMUL_MulEd_t; int OMUL_mt; if( OMUL_ToMul <= -1.0 || OMUL_ToMul >= 1.0 || OMUL_Mul <= -1.0 || OMUL_Mul >= 1.0 )OMUL_MulEd = OMUL_ToMul * OMUL_Mul; if( OMUL_ToMul > -1.0 && OMUL_ToMul < 1.0 && OMUL_Mul > -1.0 && OMUL_Mul < 1.0 ){ OMUL_mt=0; while( OMUL_Mul > -1.0 && OMUL_Mul < 1.0 ){ OMUL_MUL_mt = OMUL_Mul * 10.0; OMUL_Mul = OMUL_MUL_mt; OMUL_mt++;} OMUL_MulEd = OMUL_ToMul * OMUL_MUL_mt; for( OMUL_mt ; OMUL_mt > 1 ; OMUL_mt-- ){ OMUL_MulEd_t = OMUL_MulEd / 10.0; OMUL_MulEd = OMUL_MulEd_t;} } return OMUL_MulEd; } //============================================================================================================= // I N I T //============================================================================================================= void OnInit(){ // === Anzeige des Indikatornamens und der Werte IndicatorShortName(IndisName); IndicatorBuffers(6);// Gesamtanzahl aller Buffer //------------------------------------------------------------------------------------------------------------- // Buffer 0 SetIndexBuffer(0,BUF_A); SetIndexLabel(0, "BUF_A" );// Beschreibung im Datenfenster SetIndexDrawBegin(0,0); // Buffer 1 SetIndexBuffer(1,BUF_B); SetIndexLabel(1, "BUF_B" );// Beschreibung im Datenfenster SetIndexDrawBegin(1,0); // Buffer 2 SetIndexBuffer(2,BUF_C); SetIndexLabel(2, "BUF_C" );// Beschreibung im Datenfenster SetIndexDrawBegin(2,0); // Buffer 3 SetIndexBuffer(3,BUF_D); SetIndexLabel(3, "BUF_D" );// Beschreibung im Datenfenster SetIndexDrawBegin(3,0); // Buffer 4 SetIndexBuffer(4,BUF_E); SetIndexLabel(4, "BUF_E" );// Beschreibung im Datenfenster SetIndexDrawBegin(4,0); // Buffer 5 SetIndexBuffer(5,BUF_F); SetIndexLabel(5, "BUF_F" );// Beschreibung im Datenfenster SetIndexDrawBegin(5,0); //------------------------------------------------------------------------------------------------------------- }// OnInit //============================================================================================================= // D E I N I T //============================================================================================================= void OnDeinit(const int reason){}// nothing to do here //============================================================================================================= // O N C A L C U L A T E //============================================================================================================= 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[]){ //------------------------------------------------------------------------------------------------------------- for( i=0 ; rates_total-MA_Mi_Period-3 > i ; i++ ){// ? //============================================================================================================= // D E K L A R A T I O N P R I C E //============================================================================================================= Pr_Hi=iHigh (NULL,NULL,i); Pr_Op=iOpen (NULL,NULL,i); Pr_Cl=iClose(NULL,NULL,i); Pr_Lo=iLow (NULL,NULL,i); Pr_ME = ( Pr_Hi + Pr_Lo ) / 2.0; Pr_TY = ( Pr_Hi + Pr_Cl + Pr_Lo ) / 3.0; Pr_WE = ( Pr_Hi + Pr_Cl + Pr_Cl + Pr_Lo ) / 4.0; // Zuweisung miPR if(Price_Mi==PRICE_HIGH )miPR=Pr_Hi; if(Price_Mi==PRICE_CLOSE )miPR=Pr_Cl; if(Price_Mi==PRICE_OPEN )miPR=Pr_Op; if(Price_Mi==PRICE_LOW )miPR=Pr_Lo; if(Price_Mi==PRICE_MEDIAN )miPR=Pr_ME; if(Price_Mi==PRICE_TYPICAL )miPR=Pr_TY; if(Price_Mi==PRICE_WEIGHTED)miPR=Pr_WE; //============================================================================================================= // D E K L A R A T I O N M A S //============================================================================================================= hiMA=iMA(Symbol(),Period(),MA_Hi_Period,MA_Hi_ChartShift,MA_Hi_Method,PRICE_HIGH,i); miMA=iMA(Symbol(),Period(),MA_Mi_Period,MA_Mi_ChartShift,MA_Mi_Method,MA_Mi_Price,i); loMA=iMA(Symbol(),Period(),MA_Lo_Period,MA_Lo_ChartShift,MA_Lo_Method,PRICE_LOW,i); //============================================================================================================= // O D I V //============================================================================================================= OD_hiPR = ODIV(1.0// Soll dividiert werden , hiPR// Wert, der evtl. kleiner als 1.0 ist ); OD_hiMA = ODIV(1.0// Soll dividiert werden , hiMA// Wert, der evtl. kleiner als 1.0 ist ); OD_miPR = ODIV(1.0// Soll dividiert werden , miPR// Wert, der evtl. kleiner als 1.0 ist ); OD_miMA = ODIV(1.0// Soll dividiert werden , miMA// Wert, der evtl. kleiner als 1.0 ist ); OD_loPR = ODIV(1.0// Soll dividiert werden , loPR// Wert, der evtl. kleiner als 1.0 ist ); OD_loMA = ODIV(1.0// Soll dividiert werden , loMA// Wert, der evtl. kleiner als 1.0 ist ); //============================================================================================================= // B U F F E R //============================================================================================================= BUF_A[i] = OMUL(hiMA// Soll multipliziert werden , OD_loPR// Wert, der evtl. kleiner als 1.0 ist ); BUF_B[i] = OMUL(hiPR// Soll multipliziert werden , OD_loMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_C[i] = OMUL(OD_miPR// Soll multipliziert werden , miMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_D[i] = OMUL(OD_miMA// Soll multipliziert werden , miPR// Wert, der evtl. kleiner als 1.0 ist ); BUF_E[i] = OMUL(loPR// Soll multipliziert werden , OD_hiMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_F[i] = OMUL(loMA// Soll multipliziert werden , OD_hiPR// Wert, der evtl. kleiner als 1.0 ist ); //============================================================================================================= // E N D E F U N K T I O N E N //============================================================================================================= }// for (i=ratestotal)... //============================================================================================================= // E N D E I N D I //============================================================================================================= return(rates_total);}// OnCalculate |
|
|||
Vermute, dass es an der rates_total for-loop liegt.
Code:
for( i=0 ; rates_total-MA_Hi_Period-MA_Mi_Period-MA_Lo_Period-2 > i ; i++ ){// ? Code:
for( i=0 ; rates_total-MA_Period-3 > i ; i++ ){// ? Code:
//============================================================================= #property version "OdHML_6B_SEP_v2.mq4" #property description "erst mal keine" #property link "daniel-rudloff@web.de" //============================================================================= #property indicator_separate_window// Unterfenster #property indicator_buffers 6 #property indicator_color1 clrGreen// Farbe der Linie #property indicator_width1 1 #property indicator_color2 clrOrange// Farbe der Linie #property indicator_width2 1 #property indicator_color3 clrPaleGreen// Farbe der Linie #property indicator_width3 1 #property indicator_color4 clrPaleGreen// Farbe der Linie #property indicator_width4 1 #property indicator_color5 clrRed// Farbe der Linie #property indicator_width5 1 #property indicator_color6 clrGreen// Farbe der Linie #property indicator_width6 1 //============================================================================= //============================================================================================================= // G L O B A L E E I N S T E L L U N G E N //============================================================================================================= extern int MA_Hi_Period = 6;// Zum Testen 6 extern int MA_Hi_ChartShift = 0; input ENUM_MA_METHOD MA_Hi_Method = MODE_SMA; input ENUM_APPLIED_PRICE Price_Mi=PRICE_CLOSE; extern int MA_Mi_Period = 6;// Zum Testen 6 extern int MA_Mi_ChartShift = 0; input ENUM_MA_METHOD MA_Mi_Method = MODE_SMA; input ENUM_APPLIED_PRICE MA_Mi_Price = PRICE_CLOSE; extern int MA_Lo_Period = 6;// Zum Testen 6 extern int MA_Lo_ChartShift = 0; input ENUM_MA_METHOD MA_Lo_Method = MODE_SMA; //============================================================================================================= // G L O B A L E D E K L A //============================================================================================================= //============================================================================================================= string IndisName = "OdHML_6B_SEP"; // Indikatorname //------------------------------------------------------------------------------------------------------------- double Pr_Hi,Pr_Op,Pr_Cl,Pr_Lo,Pr_ME,Pr_TY,Pr_WE, hiPR,miPR,loPR, hiMA,miMA,loMA, OD_hiPR,OD_hiMA, OD_miPR,OD_miMA, OD_loPR,OD_loMA, BUF_A[]// Buffer 0 , BUF_B[]// Buffer 1 , BUF_C[]// Buffer 2 , BUF_D[]// Buffer 3 , BUF_E[]// Buffer 4 , BUF_F[]// Buffer 5 ; //------------------------------------------------------------------------------------------------------------- int i ; //============================================================================================================= // O P Z D I V //============================================================================================================= double ODIV( double ODIV_ToDiv// Soll dividiert werden , double ODIV_Div// Wert, der kleiner als 1.0 ist ){ double ODIV_DIV_mt , ODIV_DivEd , ODIV_DivEd_t; int ODIV_mt; if( ODIV_Div <= -1.0 || ODIV_Div >= 1.0 )ODIV_DivEd = ODIV_ToDiv / ODIV_Div; if( ODIV_Div > -1.0 && ODIV_Div < 1.0 ){ ODIV_mt=0; while( ODIV_Div > -1.0 && ODIV_Div < 1.0 ){ ODIV_DIV_mt = ODIV_Div * 10.0; ODIV_Div = ODIV_DIV_mt; ODIV_mt++;} ODIV_DivEd = ODIV_ToDiv / ODIV_DIV_mt; for( ODIV_mt ; ODIV_mt > 1 ; ODIV_mt-- ){ ODIV_DivEd_t = ODIV_DivEd * 10.0; ODIV_DivEd = ODIV_DivEd_t;} } return ODIV_DivEd; } //============================================================================================================= // O P Z M U L //============================================================================================================= double OMUL( double OMUL_ToMul// Soll multipliziert werden , double OMUL_Mul// Wert, der kleiner als 1.0 ist ){ double OMUL_MUL_mt , OMUL_MulEd , OMUL_MulEd_t; int OMUL_mt; if( OMUL_ToMul <= -1.0 || OMUL_ToMul >= 1.0 || OMUL_Mul <= -1.0 || OMUL_Mul >= 1.0 )OMUL_MulEd = OMUL_ToMul * OMUL_Mul; if( OMUL_ToMul > -1.0 && OMUL_ToMul < 1.0 && OMUL_Mul > -1.0 && OMUL_Mul < 1.0 ){ OMUL_mt=0; while( OMUL_Mul > -1.0 && OMUL_Mul < 1.0 ){ OMUL_MUL_mt = OMUL_Mul * 10.0; OMUL_Mul = OMUL_MUL_mt; OMUL_mt++;} OMUL_MulEd = OMUL_ToMul * OMUL_MUL_mt; for( OMUL_mt ; OMUL_mt > 1 ; OMUL_mt-- ){ OMUL_MulEd_t = OMUL_MulEd / 10.0; OMUL_MulEd = OMUL_MulEd_t;} } return OMUL_MulEd; } //============================================================================================================= // I N I T //============================================================================================================= void OnInit(){ // === Anzeige des Indikatornamens und der Werte IndicatorShortName(IndisName); IndicatorBuffers(6);// Gesamtanzahl aller Buffer //------------------------------------------------------------------------------------------------------------- // Buffer 0 SetIndexBuffer(0,BUF_A); SetIndexLabel(0, "BUF_A" );// Beschreibung im Datenfenster SetIndexDrawBegin(0,0); // Buffer 1 SetIndexBuffer(1,BUF_B); SetIndexLabel(1, "BUF_B" );// Beschreibung im Datenfenster SetIndexDrawBegin(1,0); // Buffer 2 SetIndexBuffer(2,BUF_C); SetIndexLabel(2, "BUF_C" );// Beschreibung im Datenfenster SetIndexDrawBegin(2,0); // Buffer 3 SetIndexBuffer(3,BUF_D); SetIndexLabel(3, "BUF_D" );// Beschreibung im Datenfenster SetIndexDrawBegin(3,0); // Buffer 4 SetIndexBuffer(4,BUF_E); SetIndexLabel(4, "BUF_E" );// Beschreibung im Datenfenster SetIndexDrawBegin(4,0); // Buffer 5 SetIndexBuffer(5,BUF_F); SetIndexLabel(5, "BUF_F" );// Beschreibung im Datenfenster SetIndexDrawBegin(5,0); //------------------------------------------------------------------------------------------------------------- }// OnInit //============================================================================================================= // D E I N I T //============================================================================================================= void OnDeinit(const int reason){}// nothing to do here //============================================================================================================= // O N C A L C U L A T E //============================================================================================================= 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[]){ //------------------------------------------------------------------------------------------------------------- for( i=0 ; rates_total-MA_Hi_Period-MA_Mi_Period-MA_Lo_Period-2 > i ; i++ ){// ? //============================================================================================================= // D E K L A R A T I O N P R I C E //============================================================================================================= Pr_Hi=iHigh (NULL,NULL,i); Pr_Op=iOpen (NULL,NULL,i); Pr_Cl=iClose(NULL,NULL,i); Pr_Lo=iLow (NULL,NULL,i); Pr_ME = ( Pr_Hi + Pr_Lo ) / 2.0; Pr_TY = ( Pr_Hi + Pr_Cl + Pr_Lo ) / 3.0; Pr_WE = ( Pr_Hi + Pr_Cl + Pr_Cl + Pr_Lo ) / 4.0; // Zuweisung miPR if(Price_Mi==PRICE_HIGH )miPR=Pr_Hi; if(Price_Mi==PRICE_CLOSE )miPR=Pr_Cl; if(Price_Mi==PRICE_OPEN )miPR=Pr_Op; if(Price_Mi==PRICE_LOW )miPR=Pr_Lo; if(Price_Mi==PRICE_MEDIAN )miPR=Pr_ME; if(Price_Mi==PRICE_TYPICAL )miPR=Pr_TY; if(Price_Mi==PRICE_WEIGHTED)miPR=Pr_WE; //============================================================================================================= // D E K L A R A T I O N M A S //============================================================================================================= hiMA=iMA(NULL,NULL,MA_Hi_Period,MA_Hi_ChartShift,MA_Hi_Method,PRICE_HIGH,i); miMA=iMA(NULL,NULL,MA_Mi_Period,MA_Mi_ChartShift,MA_Mi_Method,MA_Mi_Price,i); loMA=iMA(NULL,NULL,MA_Lo_Period,MA_Lo_ChartShift,MA_Lo_Method,PRICE_LOW,i); //============================================================================================================= // O D I V //============================================================================================================= OD_hiPR = ODIV(1.0// Soll dividiert werden , hiPR// Wert, der evtl. kleiner als 1.0 ist ); OD_hiMA = ODIV(1.0// Soll dividiert werden , hiMA// Wert, der evtl. kleiner als 1.0 ist ); OD_miPR = ODIV(1.0// Soll dividiert werden , miPR// Wert, der evtl. kleiner als 1.0 ist ); OD_miMA = ODIV(1.0// Soll dividiert werden , miMA// Wert, der evtl. kleiner als 1.0 ist ); OD_loPR = ODIV(1.0// Soll dividiert werden , loPR// Wert, der evtl. kleiner als 1.0 ist ); OD_loMA = ODIV(1.0// Soll dividiert werden , loMA// Wert, der evtl. kleiner als 1.0 ist ); //============================================================================================================= // B U F F E R //============================================================================================================= BUF_A[i] = OMUL(hiMA// Soll multipliziert werden , OD_loPR// Wert, der evtl. kleiner als 1.0 ist ); BUF_B[i] = OMUL(hiPR// Soll multipliziert werden , OD_loMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_C[i] = OMUL(OD_miPR// Soll multipliziert werden , miMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_D[i] = OMUL(OD_miMA// Soll multipliziert werden , miPR// Wert, der evtl. kleiner als 1.0 ist ); BUF_E[i] = OMUL(loPR// Soll multipliziert werden , OD_hiMA// Wert, der evtl. kleiner als 1.0 ist ); BUF_F[i] = OMUL(loMA// Soll multipliziert werden , OD_hiPR// Wert, der evtl. kleiner als 1.0 ist ); //============================================================================================================= // E N D E F U N K T I O N E N //============================================================================================================= }// for (i=ratestotal)... //============================================================================================================= // E N D E I N D I //============================================================================================================= return(rates_total);}// OnCalculate |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|