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

Lender

Активный участник
Здравствуйте. Хотел бы узнать.
double massiv1[];
...
int start()
{
massiv1[1]=2;
Alert(massiv1[1]);
...

Выводит 0.
Вообщем проблема в том что не могу вывести значения массивов.
Даже если будет:
int massiv1[];
string a;
...
int start()
{
massiv1[1]=2;
a=massiv[1];
Alert(a);
...
один хрен вылезет 0. Почему и как лечить ся?

double massiv1[]; // <-- создаем ссылку на область памяти, если размер не задан, то и памяти под массив не выделяется
// нужно сделать так:
int size = 10;
ArrayResize(massiv1, size); // выделяем нужное кол-во памяти, и устанавливаем на ее ссылку(задаем размер нашего массива)

massiv1[1]=2;
Alert(massiv1[1]); // вуаля, печатает то что нужно

//----------------------------------------------------------------
// в следуюжем примере

int massiv1[];
string a;

...
a=massiv[1]; // не корректно записывать в string int
// нужно так
a = DoubleToStr( massiv[1, 0 )
 
Последнее редактирование:

lexun

Активный участник
Lender, спасибо за ответ. Сейчас пока не могу опробовать, потом сделаю, только вот опять вопросы.
Если у меня нельзя сначалв узнать размерность массива т.е. он динамический, как тогда.
Вроде как не пробовал в mql помоему у меня пишет что нет таких команд как IntToStr, ну и как думаю что и DoubleToStr.
И еще: как нормально вывести дату в Alert. Если просто выводит то как я понимаю вылезет количество секунд ...,
команда MessageBox вроде как обрабатывается нормально, но почему то ничего не выводит, должна ли, или ее уже вывели из работы. Огромное спасибо
 

Lender

Активный участник
Lender, спасибо за ответ. Сейчас пока не могу опробовать, потом сделаю, только вот опять вопросы.
Если у меня нельзя сначалв узнать размерность массива т.е. он динамический, как тогда.
Вроде как не пробовал в mql помоему у меня пишет что нет таких команд как IntToStr, ну и как думаю что и DoubleToStr.
И еще: как нормально вывести дату в Alert. Если просто выводит то как я понимаю вылезет количество секунд ...,
команда MessageBox вроде как обрабатывается нормально, но почему то ничего не выводит, должна ли, или ее уже вывели из работы. Огромное спасибо

выделяем память для массива с запасом не без фанатизма

IntToStr у меня тоже нет а DoubleToStr есть

в MessageBox(TimeCurrent()) - не работает, так как требуется параметер string а не datetime
юзаем TimeToStr() для отображения времени в виде строки

читаем хелп:
void Alert( ...)
Отображает диалоговое окно, содержащие пользовательские данные. Параметры могут быть любого типа. Количество параметров не может превышать 64.

Массивы нельзя передавать в функцию Alert(). Массивы должны выводиться поэлементно.

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().
Данные типы bool, datetime и color будут выведены как числа.
Чтобы вывести данные типа datetime в виде строки, необходимо использовать функцию TimeToStr().

Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n".
См. также функции Comment() и Print().
Параметры:
... - Любые значения, разделенные запятыми.

Пример:
if(Close[0]>SignalLevel)
Alert("Price ", Close[0]," is coming!!!");
 
Последнее редактирование:

Aleh#

Прохожий
Прошу прощение ,что не совсем по теме,может есть здесь специ которые могут переделать мои советник из mq4 в джава.(под дуаскопи ,Jforex).
:question:
 

denss22

Прохожий
Вопрос к програмистам. Добавить выбор направления открытия ордеров.

Здравствуйте!!!
Ребята Помогите пожалуйста в решении одного простого (для Вас) вопроса.
В советнике необходимо поставить выбор направления торговли (sell или buy).Т. к. он ставит ордера от балды, потом локом их выводит. После именения его эффективность резко возрастет.
Заранее огромное СПАСИБО!!!
 

Вложения

  • ShockBar v.1.1.mq4
    26,3 КБ · Просмотры: 87

Lender

Активный участник
при кидании советников на график можно задавать в какую сторону разрешено торговать советникам
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    153,6 КБ · Просмотры: 73

denss22

Прохожий
при кидании советников на график можно задавать в какую сторону разрешено торговать советникам
Спасибо большое! Разобрался!
Отличный получился советник, когда работает в два направления не дает большой просадки и больше зарабатывает!!!
 

Gek34

Прохожий
Подскажите неучу

подскажите пожалуйска как задать условие, чтобы при смене цвета индикатора поступала команда на ( открытие ,закрытие) ордера.
индикатор прилагается

Посмотреть вложение octopus_2.ex4
 

Corey Hate

Новичок форума
Здравствуйте! Помогите, пожалуйста, разобраться с кодом.
double FrUp,FrDn;
for (int i=3; i<300; i++)
{
FrUp = NormalizeDouble(iFractals(NULL,0,MODE_UPPER,i), Digits);
if (FrUp!=0) {FrUp = FrUp+Delta*Point; if (Ask+STOPLEVEL*Point < FrUp) break;}
FrUp=0;
Меня интересует "i". Не могу понять, в вышеприведенном коде, описан поиск последнего верхнего фрактала или самого верхнего на всем расстоянии в 300 баров от текущего?
 

Lender

Активный участник
i - целое число которое в цикле перебирается от 3 до 300, (3, 4, 5, ..., 298, 299)

в указанном отрывке мы ищем первый фрактал который выше Ask+STOPLEVEL
 

anonimmmmm

Новичок форума
Помогите с безубытком

Привет. Делаю иланоподобный сов, но не могу написать функцию для расчета безубытка. Например есть серия ордеров buy, открытых через 20 пунктов одинаковыми или разными лотами. Где нашел это считается как (сумма цен открыия * лот) деленная на сумму лотов. Но это же неправильно.
 

Energetik777

Активный участник
Здравствуйте. Подскажите пожалуйста как правильно составить функцию поиска наибольшей цены открытия ордера среди открытых ордеров?
У меня получился такой код, но он не дает нужного результата. Заранее спасибо.

void Max_cena_buy(string sy="", int op=-1, int mn=-1) {
double max_buy=0;
int i, k=OrdersTotal(), np=-1;

if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (OrderType()==OP_BUY)) {
if (OrderMagicNumber()==mn) {
if (max_buy<OrderOpenPrice()) {
max_buy=OrderOpenPrice();
np=i;
}
}
}
}
}
}
 

seb29

Прохожий
Кто знает ..поможите с добавлением функции в код.

Добрый день.

Как и какую функцию (переменную) надо добавить в код советника, что бы исполнения кода было с задержкой в секундах.? (то есть советник не сразу открывает ордер при появлении своего сигнала, а с задержкой) .

:fa:
 

PAZITIV

Прохожий
советник на основе QQEA

в общем, получается идея советника такая: когда красная линия пересекает жёлтую снизу вверх, должен открыться один ордер на Buy (и закрыться на SELL -- если есть), когда красная пересекает жёлтую вверху вниз -- один ордер на Sell (и закрыться Buy -- если есть). Но у меня не получается открыть только один ордер. Ордера открываются , пока выполняется условие -- т.е. на каждом баре. Как открыть только одну сделку

ЗЫ в iCustom костыльно сделано через стринг потому что напрямую через дабл ересь какую то выдавало

//+------------------------------------------------------------------+
//| QQEA-Advisor.mq4 |
//| Copyright © 2012, PAZITIV |
//| pazitiv.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, PAZITIV"
#property link "pazitiv.net"

//--- input parameters
extern double MaxRisk=1.0;
extern double FixLot = 0.01;
extern double Exponent=2.0;
extern int Magic = 888;

// костыли

extern int TakeProfit=100;
extern int StopLoss=100;




//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int Count=0;
double b0,b1;
int ticket;





// параметры индикатора
int SF = 5; // original 5
int RSI_Period = 14; // original 14
double DARFACTOR = 4.236; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
string Buffer0 = iCustom(NULL, 0, "QQEA" , SF, RSI_Period, DARFACTOR,0 , 0);
// Buffer1 -- жёлтый пунктир
string Buffer1 = iCustom(NULL, 0, "QQEA" , SF, RSI_Period, DARFACTOR,1 , 0);



b0=StrToDouble(Buffer0);
b1=StrToDouble(Buffer1);


double Lot=GetLot(MaxRisk);


// если лот <0 выводим сообщение об ошибке
if(Lot==0)
{
Alert("Недостаточно средств!");
return(0);
}


if (Lot!=0 && b0>b1) // если лот <> 0 и красная выше жёлтой
{
ticket=NewOrder(OP_BUY,Lot);
if (ExistOrders(Symbol(), 1, 888, 0) == true ) // проверяем наличие ордера sell
{
CloseOrder();
}
}


if (Lot!=0 && b0<b1) // если лот <> 0 и красная выше жёлтой
{
ticket=NewOrder(OP_SELL,Lot);
if (ExistOrders(Symbol(), 0, 888, 0) == true ) // проверяем наличие ордера buy
{
CloseOrder();
}
}





Comment("Red line: ",b0,"Yellow line: ",b1);



return(0);
}







//-------------------------------------------------------------
//расчёт лота

double GetLot(int Risk)
{double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
if(Lot*One_Lot>Free) return(0.0);
return(Lot);}


bool ExistOrders(string sy="", int op=-1, int Magic=-1, datetime ot=0)
{
int i, k=OrdersTotal(), ty;

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
ty=OrderType();
if (ty>1 && ty<6) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
if (Magic<0 || OrderMagicNumber()==Magic) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
return(False);
}


//открытие нового ордера
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
double SL=0; //стоплосс
double PR=0; //Цена
while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUY)
{PR=Ask;
if(TakeProfit>0) TP=Ask+TakeProfit*Point;
if(StopLoss>0) SL=Ask-StopLoss*Point;}
if(Cmd==OP_SELL)
{PR=Bid;
if(TakeProfit>0) TP=Bid-TakeProfit*Point;
if(StopLoss>0) SL=Bid+StopLoss*Point;}
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP," ",0,0,Green);
if(tic<0) Print("Ошибка открытия ордера: " ,GetLastError());
return(tic);}


// закрытие ордера
void CloseOrder()
{double PR=0;
while(!IsTradeAllowed()) Sleep(100);
if(OrderType()==OP_BUY) PR=Bid;
if(OrderType()==OP_SELL) PR=Ask;
if(!OrderClose(OrderTicket(),OrderLots(),PR,3,Red))
Print("Ошибка закрытия ордера: " ,GetLastError());
return;}
1a8d7582
сам индикатор -- Посмотреть вложение QQEA.mq4


Уважаемые, прошу помощи
 
Добрый день!
Подскажите где найти расшифровку кодов (смотри ниже). Хочу уменьшить количество открываемых ордеров и LotExponent, но не могу найти шифр этих кодов:

int gi_96 = 0;
double gd_100 = 0.0;
int gi_108 = 1;
int gi_112 = 2;
int gi_116 = 14;
int gi_120 = 3;
bool gi_124 = FALSE;
bool gi_128 = FALSE;
bool gi_132 = TRUE;
bool gi_136 = TRUE;
bool gi_140 = FALSE;
double gd_unused_144 = 0.0;
 

cfifcfif

Элитный участник
Ребят у меня такой вопрос может он глупый ещё незнаю, если в журнале выдоёт иногда ошибку повлияет это ли навывод средств заработаные совой хотя в соседней строчке эксперты не одной ошибки.
 

Чико

Почетный гражданин
Ребят у меня такой вопрос может он глупый ещё незнаю, если в журнале выдоёт иногда ошибку повлияет это ли навывод средств заработаные совой хотя в соседней строчке эксперты не одной ошибки.

Не влияет,если сова пашет в пределах регламента по времени удержания ордера и количеству взятых пипсов-у некоторых ДЦ есть ограничения..
 
Верх