На самом деле электронная техника построена на триггерных ячейках, имеющих 2 устойчивых состояния - условный 0 и условная 1. Третьего не дано.
Из этих значений (битов) складываются байты, а из байтов - некоторые значения. Таким образом, значение в ячейке имеется всегда. Удалить ничего нельзя. Речь может идти о том, чтобы сообщить соотв. ячейкам памяти новое содержание, например, всё обнулить.
В случае со строками нуля не бывает, поскольку ноль - это число. Но есть такое понятие, как "ничего".
Я не знаю, поддерживает ли MQL4 это, но в других языках работает. "Ничего"- это две подряд (открывающая и закрывающая) двойные кавычки. Понимать это надо так, что между кавычками вообще-то находится некое строковое выражение. В данном примере это выражение как бы тоже есть, но оно являет собой нечто такое, что соответствует (аналогично) нулю в численных переменных.
Пишется так:
string A="";
Если не получится, то можно записывать пробел:
string A=" ";
На самом деле электронная техника построена на триггерных ячейках, имеющих 2 устойчивых состояния - условный 0 и условная 1. Третьего не дано.
Из этих значений (битов) складываются байты, а из байтов - некоторые значения. Таким образом, значение в ячейке имеется всегда. Удалить ничего нельзя. Речь может идти о том, чтобы сообщить соотв. ячейкам памяти новое содержание, например, всё обнулить.
В случае со строками нуля не бывает, поскольку ноль - это число. Но есть такое понятие, как "ничего".
Я не знаю, поддерживает ли MQL4 это, но в других языках работает. "Ничего"- это две подряд (открывающая и закрывающая) двойные кавычки. Понимать это надо так, что между кавычками вообще-то находится некое строковое выражение. В данном примере это выражение как бы тоже есть, но оно являет собой нечто такое, что соответствует (аналогично) нулю в численных переменных.
Пишется так:
string A="";
Спасибо, я почему-то предполагал что строка удаляется со смещением индекса.
не подскажешь что это за ошибка, забивает все логи при старте советника и ничего не работает. это похоже из за массивов.
02:57:07 2003.06.27 05:00 EXPERT v2.0 EURJPY,H1: unlisted error
02:57:07 2003.06.27 05:00 EXPERT v2.0 EURJPY,H1: unlisted error
а вот код:
string RPattern[500,1,1];
int f,s, arrsize = ArraySize(RPattern);
for ( f=1; f <=Bars; f++){ //в этом цикле массив заполняется, незнаю правильно или нет
RPattern[f,0,0]=DoubleToStr(CurTime(),0);
RPattern[f,1,0]=GetValue(60,1); //возвращает строку
RPattern[f,1,1]=iPat; //iPat=""
}
for ( f=1; f <=arrsize; f++){//здесь пытаюсь сформировать строку с разделителями для вывода в лог.
fstring=RPattern[f,1,0];
cstring=cstring+fstring+"\n";
iPat=iPat+1;
}
WriteLineInFile("PATTERN2",cstring+iPat); //вывожу в лог.
cstring="";fstring="";
for ( f=1; f <=arrsize; f++){ //здесь удаляю одинаковые значения из 2 измерения, возможно неправильно.
fstring=RPattern[f,1,0];
for ( s=1; s <=arrsize; s++){
cstring=RPattern[s,1,0];
if(StringFind(cstring,fstring)>-1){RPattern[s,1,0]="";}
}
}
for ( f=1; f <=arrsize; f++){
if(RPattern[f,1,0]!=""){fstring=RPattern[f,1,0];cstring=cstring+fstring+"\n";unPat=unPat+1;}
}
WriteLineInFile("PATTERNUn",cstring+unPat); //вывожу в лог содержимое массива без одинаковых значений.
вобщем выходит кака то странная ошибка, я с массивами еще не работал, если знакома проблема объясни пожалуйста че ему надо???
2. Беглый анализ показывает следующее:
string RPattern[500,1,1] - открыт массив с размерностью во втором индексе, равном 1.
RPattern[f,1,0] - попытка обращения к несуществующему элементу массива.
В первом случае 1 - это количество элементов по индексу.
Во втором случае 1 - это порядковый номер элемента по индексу.
Нумерация элементов индекса начинается с 0. Таким образом, 1 во втором индексе означает второй элемент по второму индексу (первый элемент имеет индекс 0, т.е. RPattern[f,0,0] .
Эта ошибка на этапе компиляции не обнаруживается.
3. (это не моё дело, конечно, но всё же имеет смысл писать код более организованно:
-использовать отступы для выделения вложенных блоков;
-использовать построчные комментарии и пр.)
"GetValue()", а во 2 "DoubleToStr(CurTime(),0)" текущее время в виде строки, т.е. хотелось бы получить 500 строк в 1 изм. где для каждой из 500 строк во втором изм. записана строка с тек. временем а в 3 пока пустое значение.
при выполнении кода вот этого эксперта выскакивает вот такая ошибка:
2006.02.24 05:00:02 2001.10.01 08:00 TEMPLATEGSO EURJPY,H4: zero divide
что это за ошибка?
Спасибо.
//+------------------------------------------------------------------+
//| Copyright 2006, TemplateGSO |
//| lolion@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2006, TemplateGSO "
#property link "lolion@mail.ru"
#define MAGIC 916883
extern double lStopLoss = 20;
extern double sStopLoss = 20;
extern double lTakeProfit = 50;
extern double sTakeProfit = 50;
extern double lTrailingStop = 20;
extern double sTrailingStop = 15;
extern int Slippage = 5;
extern double Lots = 0.10;
extern string _Parameters_b_Lots = "Параметры модуля расчёта лота";
extern int LotsWayChoice = 1; // Способ выбора рабочего лота:
// 0-фиксированный,
// 1-процент от депозита,
// 2-фракционно-пропорциональный,
// 3-фракционно-фиксированный,
extern int LotsPercent=40; // Процент от депозита
extern int LotsDeltaDepo=500; // Коэффициент приращения депозита
extern int LotsDepoForOne=500; // Размер депозита для одного минилота
extern int LotsMax=10000; // Максимальное количество минилотов
extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "TemplateGSO";
int dDigits,unPat=0, iPat=0;
int f,s, arrsize;
string fstring, cstring;
string RPattern[100000,1,1],TPattern[0,0,0];
int init(){
dDigits=MarketInfo(Symbol(),MODE_DIGITS);
arrsize = ArraySize(RPattern);
}
void deinit() {
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
for (f=1; f<=Bars; f++){
RPattern[f,1,1] = GetValue(60,f);
RPattern[f,f,1] = DoubleToStr(CurTime(),0);
RPattern[f,f,f] = "";
}
arrsize = ArraySize(RPattern);
for(f=1; f<=50000; f++){
Print("1 "+RPattern[f,1,1]+" 2 "+RPattern[f,f,1]+" 3 "+RPattern[f,f,f]);Sleep(500);}
for ( f=1; f <=arrsize; f++){
fstring=RPattern[1,1,f];
cstring=cstring+fstring+"\n";
iPat=iPat+1;
}
WriteLineInFile("PATTERN2",cstring+iPat);
cstring="";fstring="";
for ( f=1; f <=arrsize; f++){
fstring=RPattern[1,1,f];
for ( s=1; s <=arrsize; s++){
cstring=RPattern[1,1,s];
if(StringFind(cstring,fstring)>-1){RPattern[s,1,1]="";}
}
}
for ( f=1; f <=arrsize; f++){
if(RPattern[1,1,f]!=""){fstring=RPattern[f,1,1];cstring=cstring+fstring+"\n";unPat=unPat+1;}
}
WriteLineInFile("PATTERNUn",cstring+unPat);
if (!ExistPositions()){
if (false){OpenBuy();}
if (false){OpenSell();}}
if (ExistPositions()){
if(OrderType()==OP_BUY){
if (false){CloseBuy();}}
if(OrderType()==OP_SELL){
if (false){CloseSell();}}
if (lTrailingStop>0||sTrailingStop>0){TrailingPositionsBuy(lTrailingStop);TrailingPositionsSell(sTrailingStop);}}
return (0);}
string GetValue(int TF, int Shift){
string Pat;
double IMacdHist, IMacdSign, Ima, Isar, Ifatl, IStochMain, IstochSignl;
double PivotR2, PivotR1, PivotC, PivotS1, PivotS2;
IMacdHist = NormalizeDouble(iMACD(NULL,TF,10,16,7,PRICE_TYPICAL,MODE_MAIN,Shift),dDigits+1);
IMacdSign = NormalizeDouble(iMACD(NULL,TF,10,16,7,PRICE_TYPICAL,MODE_SIGNAL,Shift),dDigits+1);
Ima = NormalizeDouble(iMA(NULL,TF,7,0,MODE_EMA,PRICE_TYPICAL,Shift),dDigits)/NormalizeDouble(iMA(NULL,TF,14,0,MODE_EMA,PRICE_TYPICAL,Shift),dDigits);
Isar = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iSAR(NULL,TF,0.005,0.2,Shift),dDigits);
IStochMain = NormalizeDouble(iStochastic(NULL,TF,5,3,3,MODE_EMA,1,MODE_MAIN,Shift),4);
IstochSignl = NormalizeDouble(iStochastic(NULL,TF,5,3,3,MODE_EMA,1,MODE_SIGNAL,Shift),4);
PivotR2 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup2",0,0,Shift),dDigits);
PivotR1 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup",0,0,Shift),dDigits);
PivotC = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_PP_Full",0,0,Shift),dDigits);
PivotS1 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup",0,1,Shift),dDigits);
PivotS2 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup2",0,1,Shift),dDigits);
Pat=StringConcatenate(IMacdHist,"|",IMacdSign,"|",Ima,"|",Isar);
return(Pat);
//if(PrevPat!=Pat){unPat=unPat+1; PrevPat=Pat; WriteLineInFile("PATTERN",Pat+"|"+CurTime());}
//WriteLineInFile("PATTERN2",Pat+"|"+CurTime());
//iPat=iPat+1;
}
//+----------------------------------------------------------------------------+
//| Функция записи строки в файл протокола function///|
//+----------------------------------------------------------------------------+
void WriteLineInFile(string FileName,string Line){//1
int LastError = 0;
int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," ");
if(HFile>0)
{//2
FileSeek(HFile,0,SEEK_END);
FileWrite(HFile,Line);
FileFlush(HFile);
FileClose(HFile);
}else{Print("There is an error with opening file "+GetLastError());}
}//1
//+----------------------------------------------------------------------------+
//| Конец функции записи строки в файл протокола function///|
//+----------------------------------------------------------------------------+
bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
return(True);
}
}
}
return(false);
}
void TrailingPositionsBuy(int trailingStop) {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
if (OrderType()==OP_BUY) {
if (Bid-OrderOpenPrice()>trailingStop*Point) {
if (OrderStopLoss()<Bid-trailingStop*Point)
ModifyStopLoss(Bid-trailingStop*Point);
}
}
}
}
}
}
void TrailingPositionsSell(int trailingStop) {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
if (OrderType()==OP_SELL) {
if (OrderOpenPrice()-Ask>trailingStop*Point) {
if (OrderStopLoss()>Ask+trailingStop*Point || OrderStopLoss()==0)
ModifyStopLoss(Ask+trailingStop*Point);
}
}
}
}
}
}
void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
}
void CloseBuy() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
}
void CloseSell() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
}
void OpenBuy() {
double ldLot, ldStop, ldTake;
string lsComm;
ldLot = GetSizeLot();
ldStop = GetStopLossBuy();
ldTake = GetTakeProfitBuy();
lsComm = GetCommentForOrder();
OrderSend(Symbol(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenBuy);
}
void OpenSell() {
double ldLot, ldStop, ldTake;
string lsComm;
ldLot = GetSizeLot();
ldStop = GetStopLossSell();
ldTake = GetTakeProfitSell();
lsComm = GetCommentForOrder();
OrderSend(Symbol(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenSell);
}
string GetCommentForOrder() { return(Name_Expert); }
double GetSizeLot() {
double dLot;
if (LotsWayChoice==0) dLot=Lots;
Print("0 ",dLot);
// фиксированный процент от депозита
if (LotsWayChoice==1) {
dLot=MathCeil(AccountFreeMargin()/10000*LotsPercent)/10;
Print("1 ",dLot);
}
// фракционно-пропорциональный
if (LotsWayChoice==2) {
int k=LotsDepoForOne;
for (double i=2; i<=LotsMax; i++) {
k=k+i*LotsDeltaDepo;
if (k>AccountFreeMargin()) {
dLot=(i-1)/10; break;
}
}
Print("2 ",dLot);
}
// фракционно-фиксированный
if (LotsWayChoice==3) {
dLot=MathCeil((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10;
Print("3 ",dLot);
}
if (dLot<0.1) dLot=0.1;
if (dLot>LotsMax) dLot=LotsMax;
return(NormalizeDouble(dLot,1));
}
double GetStopLossBuy(){
if (lStopLoss>0){
return (Bid-(lStopLoss*Point));
}
if (lStopLoss == 0){
return (0);
}
}
double GetStopLossSell(){
if (sStopLoss>0){
return(Ask+(sStopLoss*Point));
}
if (sStopLoss == 0){
return (0);
}
}
double GetTakeProfitBuy(){
if (lTakeProfit>0){
return(Ask+(lTakeProfit*Point));
}
if (lTakeProfit == 0){
return(0);
}
}
double GetTakeProfitSell(){
if (sTakeProfit>0){
return(Bid-(sTakeProfit*Point));
}
if (sTakeProfit == 0){
return(0);
}
}
1. Привести код в порядок (отступы и комментарий). У каждого свой стиль, конечно. Но оч. трудно воспрнимать чужой код, есл не понятно что имел ввиду автор.
2. Или я чего-то не понимаю или всё же это явная ошибка.
Определён массив:
string RPattern[100000,1,1]
Размерность масива по второму индексу - единица.
Обращение к массиву в цикле:
for (f=1; f<=Bars; f++){
RPattern[f,1,1] = GetValue(60,f);
RPattern[f,f,1] = DoubleToStr(CurTime(),0);
RPattern[f,f,f] = "";
}
Что имеется ввиду в строках:
RPattern[f,f,1] = DoubleToStr(CurTime(),0); RPattern[f,f,f] = "";
Bars, а сответственно и f может принимать значения больше единицы.
Массив так определён, что в нём не предусмотрены такие ячейки.
Естественно, что во время исполнения программы, при попытке обращения к несуществующей ячейке массива система будет квалифицировать это действие как ошибочное, о чём будет сообщено в письменном виде в лог-файл. Теперь помножь второй индекс на третий (по колич. баров) и посчитай сколько будет записей в логе об ошибочных обращениях.
Дальше анализировать код нет смысла.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
с помощью вложенного цикла можно например найти совпадающие значения, получить их индексы или пересчитать, но вот как удалить???