Oh yeah, I forgot to mention with regards to the above - if I do the same using other variable types (e.g. int), everything works fine no matter how I initialize the variable.
Hi,
Here's a nice bit of code that makes the platform crash...
int init() {
Print("Starting");
return(0);
}
int deinit() {}
int start() {}
I know you're not supposed to do a return during init() but this can be useful when debugging.... However, any 'return' during an init() appears to make the platform crash.
Here's a nice bit of code that makes the platform crash...
int init() {
Print("Starting");
return(0);
}
int deinit() {}
int start() {}
I know you're not supposed to do a return during init() but this can be useful when debugging.... However, any 'return' during an init() appears to make the platform crash.
Ahhh - silly me - init(), deinit() and start() all require a 'return'! The above problem seems to happen when start() hasn't got any code, including a return.
Hi,
I'm getting constant MT crashes when I attempt to run the following code. Anyone got any ideas as to what could be causing this?
=========================================
//+------------------------------------------------------------------+
//| commonLib.mqh |
//| Coen Willemse |
//| "" |
//+------------------------------------------------------------------+
#import "commonLib.ex4"
void split(string splitString, string splitOn, string& splitArray[]);
===========================================
//+------------------------------------------------------------------+
//| commonLib.mq4 |
//| Coen Willemse |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Coen Willemse"
#property library
// Splits the sting 'splitString' into it's various parts, splitting on 'splitOn'
void split(string splitString, string splitOn, string& splitArray[]) {
// Initialise and clear out original 'splitArray'
int i;
int startIndex = 0;
int endIndex = 0;
int elementCount = 0;
for (i=0; i<ArraySize(splitArray); i++) {
splitArray[i] = ;
}
// Resize 'splitArray' to maximum string size (256)
ArrayResize(splitArray, 260);
// Go through 'splitString' and assign each token between 'splitOn' to 'splitArray'
int splitOnLength = StringLen(splitOn);
for (i=0; StringFind(splitString, splitOn, startIndex) > -1; i++) {
endIndex = StringFind(splitString, splitOn, startIndex);
splitArray[i] = StringSubstr(splitString, startIndex, endIndex-startIndex);
startIndex = endIndex + splitOnLength;
elementCount++;
}
// Add on last token if 'splitString' doesn't end with the 'splitOn' char(s)
if (StringSubstr(splitString, (StringLen(splitString) - splitOnLength), StringLen(splitString)) != splitOn) {
splitArray[i] = StringSubstr(splitString, startIndex, StringLen(splitString));
elementCount++;
}
// And resize the array to contain only the actual elements.
ArrayResize(splitArray, elementCount);
return(0);
}
================================================
//+------------------------------------------------------------------+
//| signals.mqh |
//| Copyright © 2004, Coen Willemse. |
//| |
//+------------------------------------------------------------------+
#import "signals.ex4"
void MAPriceCrossOver(string gene, double& results[]);
============================================
//+------------------------------------------------------------------+
//| signals.mq4 |
//| Coen Willemse |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Coen Willemse"
#property library
#include <commonLib.mqh>
void MAPriceCrossOver(string gene, double& results[]) {
// Min/max values for the various parameters...
int MAX_PERIODS = 300;
int MAX_MA_METHOD = 7;
int MAX_APPLIED_PRICE = 7;
string splitArray[1];
double MIN_R2SCALE = 0.5;
double MAX_R2SCALE = 0.8;
double indValue; // Used to store current value of an indicator call
double prevIndValue; // Used to store previous value of an indicator call
// Split the gene into it's individual allele...
split(gene, ":", splitArray);
// Assign each variable with it's relevant allele
int periods = StrToInteger(splitArray[1]);
int maMethod = StrToInteger(splitArray[2]);
int appliedPrice = StrToInteger(splitArray[3]);
double r2Scale = StrToDouble(splitArray[4]);
// Check to see if valid input has been provided...
if (periods < 1 || periods > MAX_PERIODS) {
Alert("MAPriceCrossOver: 'periods' range is 1 to " + MAX_PERIODS + "!!");
}
if (maMethod < 1 || maMethod > MAX_MA_METHOD) {
Alert("MAPriceCrossOver: 'maMethod' range is 1 to " + MAX_MA_METHOD + "!!");
}
if (appliedPrice < 1 || appliedPrice > MAX_APPLIED_PRICE) {
Alert("MAPriceCrossOver: 'appliedPrice' range is 1 to " + MAX_APPLIED_PRICE + "!!");
}
if (r2Scale < MIN_R2SCALE || r2Scale > MAX_R2SCALE) {
Alert("MAPriceCrossOver: 'r2Scale' range is " + MIN_R2SCALE + " to " + MAX_R2SCALE + "!!");
}
// Work out which prices to use for the calculation...
int prices = 0;
switch (appliedPrice) {
case 1: prices = PRICE_CLOSE; break;
case 2: prices = PRICE_OPEN; break;
case 3: prices = PRICE_HIGH; break;
case 4: prices = PRICE_LOW; break;
case 5: prices = PRICE_MEDIAN; break;
case 6: prices = PRICE_TYPICAL; break;
case 7: prices = PRICE_WEIGHTED; break;
}
Print("Running");
ArrayResize(results, 2);
results[0] = 0.111;
results[1] = 0.222;
return(0);
}
===================================================
//+------------------------------------------------------------------+
//| Testie1.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/
#include <signals.mqh>
int init() {
Print("Starting");
return(0);
}
int deinit() { return(0);}
int start() {
double indResults[1];
MAPriceCrossOver("1:20:6:1:0.5", indResults);
for (int i=0; i<ArraySize(indResults); i++) {
Print(indResults[i]);
}
return(0);
}
//+------------------------------------------------------------------+
I'm getting constant MT crashes when I attempt to run the following code. Anyone got any ideas as to what could be causing this?
=========================================
//+------------------------------------------------------------------+
//| commonLib.mqh |
//| Coen Willemse |
//| "" |
//+------------------------------------------------------------------+
#import "commonLib.ex4"
void split(string splitString, string splitOn, string& splitArray[]);
===========================================
//+------------------------------------------------------------------+
//| commonLib.mq4 |
//| Coen Willemse |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Coen Willemse"
#property library
// Splits the sting 'splitString' into it's various parts, splitting on 'splitOn'
void split(string splitString, string splitOn, string& splitArray[]) {
// Initialise and clear out original 'splitArray'
int i;
int startIndex = 0;
int endIndex = 0;
int elementCount = 0;
for (i=0; i<ArraySize(splitArray); i++) {
splitArray[i] = ;
}
// Resize 'splitArray' to maximum string size (256)
ArrayResize(splitArray, 260);
// Go through 'splitString' and assign each token between 'splitOn' to 'splitArray'
int splitOnLength = StringLen(splitOn);
for (i=0; StringFind(splitString, splitOn, startIndex) > -1; i++) {
endIndex = StringFind(splitString, splitOn, startIndex);
splitArray[i] = StringSubstr(splitString, startIndex, endIndex-startIndex);
startIndex = endIndex + splitOnLength;
elementCount++;
}
// Add on last token if 'splitString' doesn't end with the 'splitOn' char(s)
if (StringSubstr(splitString, (StringLen(splitString) - splitOnLength), StringLen(splitString)) != splitOn) {
splitArray[i] = StringSubstr(splitString, startIndex, StringLen(splitString));
elementCount++;
}
// And resize the array to contain only the actual elements.
ArrayResize(splitArray, elementCount);
return(0);
}
================================================
//+------------------------------------------------------------------+
//| signals.mqh |
//| Copyright © 2004, Coen Willemse. |
//| |
//+------------------------------------------------------------------+
#import "signals.ex4"
void MAPriceCrossOver(string gene, double& results[]);
============================================
//+------------------------------------------------------------------+
//| signals.mq4 |
//| Coen Willemse |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Coen Willemse"
#property library
#include <commonLib.mqh>
void MAPriceCrossOver(string gene, double& results[]) {
// Min/max values for the various parameters...
int MAX_PERIODS = 300;
int MAX_MA_METHOD = 7;
int MAX_APPLIED_PRICE = 7;
string splitArray[1];
double MIN_R2SCALE = 0.5;
double MAX_R2SCALE = 0.8;
double indValue; // Used to store current value of an indicator call
double prevIndValue; // Used to store previous value of an indicator call
// Split the gene into it's individual allele...
split(gene, ":", splitArray);
// Assign each variable with it's relevant allele
int periods = StrToInteger(splitArray[1]);
int maMethod = StrToInteger(splitArray[2]);
int appliedPrice = StrToInteger(splitArray[3]);
double r2Scale = StrToDouble(splitArray[4]);
// Check to see if valid input has been provided...
if (periods < 1 || periods > MAX_PERIODS) {
Alert("MAPriceCrossOver: 'periods' range is 1 to " + MAX_PERIODS + "!!");
}
if (maMethod < 1 || maMethod > MAX_MA_METHOD) {
Alert("MAPriceCrossOver: 'maMethod' range is 1 to " + MAX_MA_METHOD + "!!");
}
if (appliedPrice < 1 || appliedPrice > MAX_APPLIED_PRICE) {
Alert("MAPriceCrossOver: 'appliedPrice' range is 1 to " + MAX_APPLIED_PRICE + "!!");
}
if (r2Scale < MIN_R2SCALE || r2Scale > MAX_R2SCALE) {
Alert("MAPriceCrossOver: 'r2Scale' range is " + MIN_R2SCALE + " to " + MAX_R2SCALE + "!!");
}
// Work out which prices to use for the calculation...
int prices = 0;
switch (appliedPrice) {
case 1: prices = PRICE_CLOSE; break;
case 2: prices = PRICE_OPEN; break;
case 3: prices = PRICE_HIGH; break;
case 4: prices = PRICE_LOW; break;
case 5: prices = PRICE_MEDIAN; break;
case 6: prices = PRICE_TYPICAL; break;
case 7: prices = PRICE_WEIGHTED; break;
}
Print("Running");
ArrayResize(results, 2);
results[0] = 0.111;
results[1] = 0.222;
return(0);
}
===================================================
//+------------------------------------------------------------------+
//| Testie1.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/
#include <signals.mqh>
int init() {
Print("Starting");
return(0);
}
int deinit() { return(0);}
int start() {
double indResults[1];
MAPriceCrossOver("1:20:6:1:0.5", indResults);
for (int i=0; i<ArraySize(indResults); i++) {
Print(indResults[i]);
}
return(0);
}
//+------------------------------------------------------------------+
Hi MetaQuotes,
I think I may have spotted a documentation fault on your website. Under the section "PreProcessor" the follow is documented:
"Functions are imported from MQL4 compiled modules (*.ex4 files) and from operating system modules (*.dll files). In the latter case, the imported functions are also declared. A new #import command (it can be without parameters) finishes the description of imported functions".
As far as I can work out, BOTH types of import (MQL4 and .dll) files require function declarations in an 'include file'. I tried it without a declaration but the compiler starts making noises about "function not found" etc.
I think I may have spotted a documentation fault on your website. Under the section "PreProcessor" the follow is documented:
"Functions are imported from MQL4 compiled modules (*.ex4 files) and from operating system modules (*.dll files). In the latter case, the imported functions are also declared. A new #import command (it can be without parameters) finishes the description of imported functions".
As far as I can work out, BOTH types of import (MQL4 and .dll) files require function declarations in an 'include file'. I tried it without a declaration but the compiler starts making noises about "function not found" etc.
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
There still seems to be a problem with the 'extern string' side of things. It appears that if the string is initialized using either:
extern string stuff;
or extern string stuff = "";
the user input screen will allow you to input a string but 'stuff' will not be assigned to the value that is input and a "not initialized string" error is generated. If the string is initialized using:
extern string stuff = "some default stringy thingy";
everything works fine