Для начала:
Приоритеты и порядок выполнения операций
Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.
() Вызов функции Слева направо
[] Выделение элемента массива
! Логическое отрицание Справа налево
- Изменение знака
++ Увеличение на единицу (increment)
-- Уменьшение на единицу (decrement)
~ Побитовое отрицание (complement)
& Побитовая операция И Слева направо
| Побитовая операция ИЛИ
^ Побитовая операция исключающее ИЛИ (eXclude OR)
<< Сдвиг влево
>> Сдвиг вправо
* Умножение Слева направо
/ Деление
% Деление по модулю
+ Сложение Слева направо
- Вычитание
< Меньше, чем Слева направо
<= Меньше или равно
> Больше, чем
>= Больше или равно
== Равно
!= Не равно
|| Логическая операция ИЛИ Слева направо
&& Логическая операция И Слева направо
= Присваивание Справа налево
+= Сложение с присваиванием
-= Вычитание с присваиванием
*= Умножение с присваиванием
/= Деление с присваиванием
%= Деление по модулю с присваиванием
>>= Сдвиг вправо с присваиванием
<<= Сдвиг влево с присваиванием
&= Побитовое И с присваиванием
|= Побитовое ИЛИ с присваиванием
^= Исключающее ИЛИ с присваиванием
, Запятая Слева направо
Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.
Внимание: приоритет выполнения операций в языке MQL4 несколько отличается от приоритета, принятого в языке Си.
Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.
() Вызов функции Слева направо
[] Выделение элемента массива
! Логическое отрицание Справа налево
- Изменение знака
++ Увеличение на единицу (increment)
-- Уменьшение на единицу (decrement)
~ Побитовое отрицание (complement)
& Побитовая операция И Слева направо
| Побитовая операция ИЛИ
^ Побитовая операция исключающее ИЛИ (eXclude OR)
<< Сдвиг влево
>> Сдвиг вправо
* Умножение Слева направо
/ Деление
% Деление по модулю
+ Сложение Слева направо
- Вычитание
< Меньше, чем Слева направо
<= Меньше или равно
> Больше, чем
>= Больше или равно
== Равно
!= Не равно
|| Логическая операция ИЛИ Слева направо
&& Логическая операция И Слева направо
= Присваивание Справа налево
+= Сложение с присваиванием
-= Вычитание с присваиванием
*= Умножение с присваиванием
/= Деление с присваиванием
%= Деление по модулю с присваиванием
>>= Сдвиг вправо с присваиванием
<<= Сдвиг влево с присваиванием
&= Побитовое И с присваиванием
|= Побитовое ИЛИ с присваиванием
^= Исключающее ИЛИ с присваиванием
, Запятая Слева направо
Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.
Внимание: приоритет выполнения операций в языке MQL4 несколько отличается от приоритета, принятого в языке Си.
Rosh, если ты хотел чего мне сказать или подсказать, то по русски если можно, я вообще не понял что ты имел ввиду. Я пробывал по разному и с одной переменной и с двумя и со всеми, результат один, зависон.
Очень уж смущает вот это место:
while(true)
{
handle = FileOpen(Symbol()+"_"+Period()+".txt",FILE_CSV|FILE_READ,";");
if(handle<1) {
Print("Файл"+Symbol()+"_"+Period()+".txt не открывается! ", GetLastError());
return(false);
}
str="";
if(handle>0) {
while(!FileIsEnding(handle) && !FileIsLineEnding(handle)) {
//string format example:
//symbol;order_type;open_price
//EURUSD;1;1.2377 - buy
//EURUSD;-1;1.2345 - sell
str=FileReadString(handle); symbol=str;
str=FileReadString(handle); signal=StrToInteger(str);
str=FileReadString(handle); OpenPrise=StrToDouble(str);
}
FileClose(handle);
}
}
нет выхода из цикла при успешном открытии файла.
Rosh, если ты хотел чего мне сказать или подсказать, то по русски если можно, я вообще не понял что ты имел ввиду. Я пробывал по разному и с одной переменной и с двумя и со всеми, результат один, зависон.
По-русски тяжело, много писать придется, я сразу увидел то, за что можно зацепиться, другой увидел непонятки с файлами. Дальше смотреть не стал.
Rosh, если ты хотел чего мне сказать или подсказать, то по русски если можно, я вообще не понял что ты имел ввиду. Я пробывал по разному и с одной переменной и с двумя и со всеми, результат один, зависон.
По-русски тяжело, много писать придется, я сразу увидел то, за что можно зацепиться, другой увидел непонятки с файлами. Дальше смотреть не стал.
А у меня кажись глаз замылился, запутался в 3-х соснах.
И несколько неиспользуемых глобальных переменных.
И несколько неиспользуемых глобальных переменных.
Протерев сутра глаза, засучив рукова, нашлась таки закавырка. Код эксперта правельный, все путем. Просто в текстовом файле все должно быть записано вот так:
EURUSD;1;1.1800;
Ранее было:
EURUSD;1;1.1800
т.е. вся проблема с завитанием тестера была в ";" в конце строки.
Или данное решение является обходным маневром и не есть правельным?
Разработчики подскажите как заставить эксперта считывать параметры построчно начиная с верхней и дальше вниз. А не только параметры из первой строки внешнего файла.
Если несложно то часть кода для понимания.
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
Если несложно то часть кода для понимания.
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
EURUSD;1;1.1827;
EURUSD;-1;1.1867;
Rosh, никак не получается сделать что-бы все читал как нужно. В приведенном тобой индикаторе цикл записан в init(), что-то у меня не получается читать. Делал как по примеру, но ничего не вышло, подскажешь?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Суть эксперта. Эксперт читает информацию из внешнего файла и при совпадении нужных параметров покупает, продаёт и закрывает сделки. Ниже код эксперта:
//+------------------------------------------------------------------+ //| Copyright 2006, HIDDEN ™ | //| Шаблон для написание экспертов | //+------------------------------------------------------------------+ #property copyright "Copyright 2006, HIDDEN ™" #property link "http://" #define MIN_STOPLOSS_POINT 10 #define MIN_TAKEPROFIT_POINT 10 #define MAGIC 125242 extern string sNameExpert = "TEMPLES ™"; extern int nAccount =0; extern double StopLoss = 0; extern double TakeProfit = 50; extern double TrailingStop = 15; extern double dLots = 0.10; extern int nSlippage = 5; extern bool lFlagUseHourTrade = True; extern int nFromHourTrade = 0; extern int nToHourTrade = 23; extern bool lFlagUseSound = True; extern string sSoundFileName = "alert.wav"; extern color colorOpenBuy = Blue; extern color colorCloseBuy = Aqua; extern color colorOpenSell = Red; extern color colorCloseSell = Aqua; extern int GSV=3; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include <lot_lib.mqh> double Upz,Dnz,sH,sL,aH,aL,fB,lB; double OpenPrise; int m, signal; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { //---- lotlib_PrevLots = 0.0; lotlib_PrevProfit = 0.0; //---- return(0); } void deinit() { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ //IsTesting(); if (lFlagUseHourTrade){ if (!(Hour()>=nFromHourTrade && Hour()<=nToHourTrade)) { Comment("Time for trade has not come else!"); return(0); } } if(Bars < 100){ Print("bars less than 100"); return(0); } if (nAccount > 0 && nAccount != AccountNumber()){ Comment("Trade on account :"+AccountNumber()+" FORBIDDEN!"); return(0); } if((StopLoss > 0 && StopLoss < MIN_STOPLOSS_POINT) || (StopLoss > 0 && StopLoss < MIN_STOPLOSS_POINT)){ Print("StopLoss less than " + MIN_STOPLOSS_POINT); return(0); } if((TakeProfit > 0 && TakeProfit < MIN_TAKEPROFIT_POINT) || (TakeProfit > 0 && TakeProfit < MIN_TAKEPROFIT_POINT)){ Print("TakeProfit less than " + MIN_TAKEPROFIT_POINT); return(0); } if(AccountFreeMargin() < (1000*dLots)){ Print("We have no money. Free Margin = " + AccountFreeMargin()); return(0); } lotlib_OpenPriceLevel = Ask; lotlib_StopLossLevel = Ask-StopLoss*Point; bool lFlagBuyOpen = false, lFlagSellOpen = false, lFlagBuyClose = false, lFlagSellClose = false; //---- calculateIndicators(); int handle; string symbol,str; while(true) { handle = FileOpen(Symbol()+"_"+Period()+".txt",FILE_CSV|FILE_READ,";"); if(handle<1) { Print("Файл"+Symbol()+"_"+Period()+".txt не открывается! ", GetLastError()); return(false); } str=""; if(handle>0) { while(!FileIsEnding(handle) && !FileIsLineEnding(handle)) { //string format example: //symbol;order_type;open_price //EURUSD;1;1.2377 - buy //EURUSD;-1;1.2345 - sell str=FileReadString(handle); symbol=str; str=FileReadString(handle); signal=StrToInteger(str); str=FileReadString(handle); OpenPrise=StrToDouble(str); } FileClose(handle); } } //---- lFlagBuyOpen = (m==0 && symbol==Symbol() && signal==1 && Ask>=OpenPrise); lFlagSellOpen = (m==0 && symbol==Symbol() && signal==-1 && Bid<=OpenPrise); lFlagBuyClose = (m==0 && symbol==Symbol() && signal==-1 && Bid<=OpenPrise); lFlagSellClose = (m==0 && symbol==Symbol() && signal==1 && Ask>=OpenPrise); //---- if (!ExistPositions()){ lotlib_PrevLots = OrderLots(); lotlib_PrevProfit = OrderProfit(); if (lFlagBuyOpen){ OpenBuy(); return(0); } if (lFlagSellOpen){ OpenSell(); return(0); } } if (ExistPositions()){ if(OrderType()==OP_BUY){ if (lFlagBuyClose){ bool flagCloseBuy = OrderClose(OrderTicket(), OrderLots(), Bid, nSlippage, colorCloseBuy); if (flagCloseBuy && lFlagUseSound) PlaySound(sSoundFileName); return(0); } } if(OrderType()==OP_SELL){ if (lFlagSellClose){ bool flagCloseSell = OrderClose(OrderTicket(), OrderLots(), Ask, nSlippage, colorCloseSell); if (flagCloseSell && lFlagUseSound) PlaySound(sSoundFileName); return(0); } } } if (TrailingStop > 0 || TrailingStop > 0){ for (int k=0; k<OrdersTotal(); k++) { if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES)) { bool lMagic = true; if (MAGIC > 0 && OrderMagicNumber() != MAGIC) lMagic = false; if (OrderSymbol()==Symbol() && lMagic) { if (OrderType()==OP_BUY && TrailingStop > 0) { if (Bid-OrderOpenPrice() > TrailingStop*Point) { if (OrderStopLoss()<Bid-TrailingStop*Point) ModifyStopLoss(Bid-TrailingStop*Point); } } if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>TrailingStop*Point) { if (OrderStopLoss()>Ask+TrailingStop*Point || OrderStopLoss()==0) ModifyStopLoss(Ask+TrailingStop*Point); } } } } } } return (0); } bool ExistPositions() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { bool lMagic = true; if (MAGIC > 0 && OrderMagicNumber() != MAGIC) lMagic = false; if (OrderSymbol()==Symbol() && lMagic) { return(True); } } } return(false); } void calculateIndicators() { // Calculate indicators' value m=TimeMinute(CurTime()); } void ModifyStopLoss(double ldStopLoss) { bool lFlagModify = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE); if (lFlagModify && lFlagUseSound) PlaySound(sSoundFileName); } void OpenBuy() { double dStopLoss = 0, dTakeProfit = 0; if (StopLoss > 0) dStopLoss = Bid-StopLoss*Point; if (TakeProfit > 0) dTakeProfit = Ask + TakeProfit * Point; int numorder = OrderSend(Symbol(), OP_BUY, Lot(), Ask, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenBuy); if (numorder > -1 && lFlagUseSound) PlaySound(sSoundFileName); } void OpenSell() { double dStopLoss = 0, dTakeProfit = 0; if (StopLoss > 0) dStopLoss = Ask+StopLoss*Point; if (TakeProfit > 0) dTakeProfit = Bid-TakeProfit*Point; int numorder = OrderSend(Symbol(),OP_SELL, Lot(), Bid, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenSell); if (numorder > -1 && lFlagUseSound) PlaySound(sSoundFileName); }Как текстовый файл прикрепить не нашел, вобщем эксперта тестить нужно на EURUSD на M30. файл из которого эксперт берет инфу называется EURUSD_30.txt и содержит всего одну строчку EURUSD;1;1.1800.
Его нужно засунуть в папку tester\files. По идее тест должен показать как минимум одну покупку, исходя из алгоритма. Но тестер вообще не двигается, ошибок не выводит, а при нажатии на STOP просто замерает и терминал весит, в чем проблема-то?