Ваши вопросы по языку MQL4

Ivan010

Прохожий
Помогите пожалуйста со скриптом.

Здравствуйте Дамы и Господа, в программировании я новичок и поэтому прошу помощи в одном из скриптов. Суть скрипта в том чтобы он находил открытые ордера отдельно SELL отдельно BUY и модифицировал их под общий тейк-профит и при срабатывании этого тейк-профита закрывались все ордера одного направления. В этом скрипте почему то не закрываются ордера и модифицируется тейк-профит только последнего ордера. Что в нем может быть не так?:

double Bprice=0;
double Blots=0;
double Bsum=0;
for (int n=0; n<buyk; n++)
{
if (OrderSelect(n,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY)

{
Blots=Blots+OrderLots();
Bsum=Bsum+OrderLots()*OrderOpenPrice();
}



if (Blots!=0) Bprice=Bsum/Blots;
if (Bprice>0 )
Bprice = NormalizeDouble(Bprice+level*Point,Digits);
if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES) == true && OrderType() == OP_BUY && buyk>1)
OrderModify(buy,OrderOpenPrice(),0,Bprice,0,Red);
}

double Sprice=0;
double Slots=0;
double Ssum=0;
for ( int e=0; e<sellk; e++)
{
if (OrderSelect(e,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL)
{
Slots=Slots+OrderLots();
Ssum=Ssum+OrderLots()*OrderOpenPrice();
}



if (Slots!=0) Sprice=Ssum/Slots;
if (Sprice>0 )


Sprice = NormalizeDouble(Sprice-level*Point,Digits);
if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES) == true && OrderType() == OP_SELL && sellk>1)
OrderModify(sell,OrderOpenPrice(),0,Sprice,0,Red);

}
double sss,bbb;
for (int b=ksb; b>0; b--)

{sss= NormalizeDouble(Bid,Digits);
bbb= NormalizeDouble(Ask,Digits);
if (OrderSelect(b,SELECT_BY_POS,MODE_TRADES )== true && OrderType() == OP_BUY && OrderCloseTime()>0)
OrderClose(OrderTicket(),OrderLots(),bbb,3,Red);}
for (int v=ksb; v>0; v--)
{if (OrderSelect(v,SELECT_BY_POS,MODE_TRADES )== true && OrderType() == OP_SELL && OrderCloseTime()>0)
OrderClose(OrderTicket(),OrderLots(),sss,3,Red);}
 
Последнее редактирование модератором:

hoz

Активный участник
Есть базовая функция библиотеная функция Init:
PHP:
Expand Collapse Copy
void fInitBase (string fs_SymbolList,
                string fs_MagicList,
                string fs_Delimiter = ",")
{
   bs_ExpertName = StringConcatenate (WindowExpertName(), ":  ", fGet_NameTF (Period()), "_", Symbol());
   bs_SymbolList = fs_SymbolList;
   bs_MagicList = fs_MagicList;
   bs_Delimiter = fs_Delimiter;
   bb_RealTrade = (!IsTesting() && !IsOptimization());
   bb_VirtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));
   if (bd_SymPoint == 0.0)
       {bd_SymPoint = fGet_Point(Symbol());}
   fGet_MarketInfo (Symbol(), -1);
   bd_MAXLOT = MarketInfo(Symbol(), MODE_MAXLOT);
   bd_LOTSTEP = MarketInfo(Symbol(), MODE_LOTSTEP);
   bi_LotPrecision = fLotPrecision ();
   bd_MINLOT = MarketInfo(Symbol(), MODE_MINLOT);
   InitializeArray_STR (bsa_Comment, "");
    //---- Определяем индекс "ошибок" в массиве комментариев (gsa_Comment)
   bi_IndERR = ArraySize (bsa_Comment) - 1;
   bi_Err = GetLastError();
   //---- Контролируем возможные ошибки
   fPrint (StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err)));

   return;
}
При запуске эксперта выводится сообщение:
PHP:
Expand Collapse Copy
2013.10.20 11:02:57	2013.08.15 00:00  hoz_LoggingToAnywhere@library EURUSD.GI,M5: Внимание! fInitBase() => Ошибка № 0 ::
Что это означает? Я только учусь работать с библиотеками, так что опыта в этом не много. Дальше по ходу, если не ставить условие вывода ошибок, если их нет, печатаются соответствующие ИНИТЫ (у меня их несколько) с ошибкой № 0 -1 т.е. - ошибок НЕТ. Но когда Ошибка № 0 что-то я не совсем понимаю, как это воспринимать.
 
Последнее редактирование модератором:

Leonup

Новичок форума
Как правильно применить функцию NewBar() ?

Добрый день!

Есть два условия.
Для покупки:
if ((((Avr - Ask)/Point) >= Dist) && (((Ask - Min)/Point) >= Dist) && (CountBuy() == 0) && (CountSell() == 0))

Для продажи:
if ((((Bid - Avr)/Point) >= Dist) && (((Max - Bid)/Point) >= Dist) && (CountSell() == 0) && (CountBuy() == 0))

Max – уровень сопротивления, Min – уровень поддержки, Avr – середина между уровнями, Dist – минимальное расстояние в пунктах.

При таких условиях открываются сделки в обе стороны, но не всегда при открытии нового бара. Поэтому применяю функцию:

bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
}
else
{
return(false);
}
}

Для покупки:
if ((NewBar() == true) && (((Avr - Ask)/Point) >= Dist) && (((Ask - Min)/Point) >= Dist) && (CountBuy() == 0) && (CountSell() == 0))

Для продажи:
if ((NewBar() == true) && (((Bid - Avr)/Point) >= Dist) && (((Max - Bid)/Point) >= Dist) && (CountSell() == 0) && (CountBuy() == 0))

Но в этом случае сделки открываются ТОЛЬКО на покупку. В логах ошибок никаких нет.

Как правильно применить функцию NewBar() ?
Спасибо.
 

qqmber

Почетный гражданин
Добрый день!

Есть два условия.
...
Как правильно применить функцию NewBar() ?
Спасибо.
Код:
Expand Collapse Copy
if (NewBar()) {
   if ((((Avr - Ask)/Point) >= Dist) && (((Ask - Min)/Point) >= Dist) && (CountBuy() == 0) && (CountSell() == 0))
   if ((((Bid - Avr)/Point) >= Dist) && (((Max - Bid)/Point) >= Dist) && (CountSell() == 0) && (CountBuy() == 0))
}
 

болгарин

Прохожий
Привет! третий месяц хожу вокруг да окала Nevalyashka_BreakdownLevel. немогу под себя подогнать.Помогите коллеги!
 

qqmber

Почетный гражданин
Здравствуйте Дамы и Господа, в программировании я новичок и поэтому прошу помощи в одном из скриптов.

Для получения помощи имеет смысл выкладывать код в тегах [CODE][/CODE] или аттачить файл, если код большой. Код должен сходу компилироваться, если только суть вопроса не в синтаксисе. Иначе шансов нет, тут мало желающих анализировать фрагменты кода, в котором нет даже объявления переменных.
 

qqmber

Почетный гражданин
...
PHP:
Expand Collapse Copy
   bi_Err = GetLastError();
   //---- Контролируем возможные ошибки
   fPrint (StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err)));
...
Но когда Ошибка № 0 что-то я не совсем понимаю, как это воспринимать.
GetLastError() возвращает 0, если ошибок нет. fPrint() твой честно его выдает. А ты что и как хотел?
 

qqmber

Почетный гражданин
Последнее редактирование:

Conn

Активный участник
Уважаемые программисты, попробовал сделать индикатор вверху в виде гистограммы (см.рис.1). получилось так что гистограмма на sell отображается иначе чем гистограмма на buy. Скажите пожалуйста в чем проблема и как ее исправить?
 

Вложения

Последнее редактирование:

ansol

Местный знаток
Уважаемые программисты, взгляните пожалуйста на рисунок и скажите в чем проблема и как ее испавить?

Ну ты спросил! :)
Может, в программе не учитывается Bid и Ask? Например, все работает по Bid, как это делают все индикаторы
 

ansol

Местный знаток
Честно говоря не понял, я в языке программирования слабоват, можно по подробнее?

Ну это я так, с разгону :)
Bid - цена покупки, именно ей оперируют все индюки и даже часто кривые советники. Между тем есть еще цена Ask - для продажи.
Если у вас на покупку Buy все верно, а на Sell неправильно, то возникает предположение, что не та цена используется. Вот и все.
Пардон, что влез, счас более вумные люди подскажут, но код надо поковырять и спрашивать по MQL4, а не "почему у меня не работает" ;)
 

Conn

Активный участник
Ну это я так, с разгону :)
Bid - цена покупки, именно ей оперируют все индюки и даже часто кривые советники. Между тем есть еще цена Ask - для продажи.
Если у вас на покупку Buy все верно, а на Sell неправильно, то возникает предположение, что не та цена используется. Вот и все.
Пардон, что влез, счас более вумные люди подскажут, но код надо поковырять и спрашивать по MQL4, а не "почему у меня не работает" ;)

Это трудно обьяснить, просто взгляните на скрин выложенный мною, и сравните два индикатора, сигнал на buy и сигнал на sell, вы увидите разницу. Выкладываю эти индикаторы оригинал версию и в виде гистограммы для сравнение.
 

Вложения

ansol

Местный знаток
Если ошибки нет, возврает же -1 по ходу, а 0 это типа ошибка - нет ошибки.

Мне лениво спорить и я пропустил ряд ляпов по моим постам ранее, но:
Хелп-то будем читать или будем сочинять ахинею?
int GetLastError( )
Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки обнуляется. Так что последующий вызов GetLastError() вернет значение 0.
Пример:
int err;
int handle=FileOpen("somefile.dat", FILE_READ|FILE_BIN);
if(handle<1)
{
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
return(0);
}
Какой минус адыныдыныдын?!
 

hoz

Активный участник
В общем, там был косяк, который я уже решил. Задача щяс другая. Есть множество объявленных глобальных переменных в заголовчном файле, часть из которых используется различными библиотеками. Если эту ПАЧКУ объявленных переменных в виде канкретного заголовочного файла помещать в каждую из библиотек это же будет не рационально и больше расход памяти так? Как-то так выходит, что иначе не придумывается...:facepalm:
 

ansol

Местный знаток
У тебю какой-то мрачно-глобальный проект :)
Обязательно такую кучу библиотек использовать?
MQL4 - довольно убогая реинкарнация языка, она не предусматривает создание суперпуперпроектов.
Может, ну его на хрен?
 

hoz

Активный участник
У тебю какой-то мрачно-глобальный проект :)
Обязательно такую кучу библиотек использовать?
MQL4 - довольно убогая реинкарнация языка, она не предусматривает создание суперпуперпроектов.
Может, ну его на хрен?

Хочу чтоб писалось всё как можно удобнее и гибче, но что-то не хрена не получается. Вот и думаю, нахрен или всё-таки возможно... Хотя пока что возможностей особо не наблюдается, хрень полнейшая выходит.
Все кого я знаю пишут "всё в одном", а мне такой подход не нравится. Совы становятся километровые, вот там точно ну его нахрен. Я уже сыт по горло километровыми совками, где ни конца ни края не видно.
А щяс написал так всё типа компактно, тока не пашет теперь..:laugh:
Распринтовав я всё увидел где косяки, но как всё структурировать ума не приложу.

На самом деле, я б очень рад был с кем-нить лично обсудить некоторые вещи, т.к. иногда одно голова хорошо, а две бывает лучше.
 
Последнее редактирование:

Who has viewed this thread (Total: 7) Посмотреть

Верх