На самом деле электронная техника построена на триггерных ячейках, имеющих 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
с помощью вложенного цикла можно например найти совпадающие значения, получить их индексы или пересчитать, но вот как удалить???