Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#826

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

ema_stop_2=iMA(Symbol(),NULL,10,0,MODE_EMA,PRICE_LOW,1);
SL=NormalizeDouble(ema_stop_2-Stoploss*Point,Digits);
так вот количество пунктов я не знаю,мне нужно их посчитать,умножить на 2 для установки тейк профита.

Изменено 6 апреля, 2014 пользователем denis77515

#827

Здравствуйте уважаемый xbms и остальные форумчане.
Может кто сталкивался с такой проблемой. Написал индикатор, и он жрет у меня 900 мб. памяти. Я решил выяснить какой именно элемент кода дает такую утечку, нашел (обозначено Суть кода: он закачивает с истории из (BarsNomber) свечей цены O, C, H, L. Но чего он потом не выгружает эту информацию из памяти??????????!!!!!!!!!
Посмотрел последний вебинар от Вас, уважаемый xbms (отдельное спасибо, уроки очень толковые, очень помогают), Вы рассказывали про классы. В справке написано, что через классы как-то решается проблема с освобождением памяти. Подскажите, как можно решить обозначенную проблему. Заранее спасибо.
P.S. Я запускал индикатор в WinXP и Win7. Так в XP все нормально (что-то около 5 mb), а в Win7 - 900 mb.

Спойлер


int init()
{
int TimeFrame [8];
TimeFrame
TimeFrame [0] = PERIOD_M1; TimeFrame [1] = PERIOD_M5; TimeFrame [2] = PERIOD_M15; TimeFrame [3] = PERIOD_M30;
TimeFrame [4] = PERIOD_H1; TimeFrame [5] = PERIOD_H4; TimeFrame [6] = PERIOD_D1; TimeFrame [7] = PERIOD_W1;
for (int i = 0; i {
Ever = MX(TimeFrame ,UpOrDown);
if (Ever == 0)Comment(i);
}
return(0);
}
//+------------------------------------------------------------------+
double MX(int TimeFrameMines, int UP_DOWN)
{
for (int i = 1; i {
H[i-1] = iHigh(NULL,TimeFrameMines,i); // L[i-1] = iLow(NULL,TimeFrameMines,i); // O[i-1] = iOpen(NULL,TimeFrameMines,i); // C[i-1] = iClose(NULL,TimeFrameMines,i); // if (O[i-1] if (O[i-1]>C[i-1] && UP_DOWN == 1) {EverX += (H[i-1]-L[i-1]);Count++;}
}
if (Count == 0)return(0);
return(EverX/Count);
}


Изменено 8 апреля, 2014 пользователем Slava2007

#828

может кто подсказать нужно что бы после каждой убыточной сделки следующий лот увеличивался а у меня когда бай и селл только после этого увеличивает лот

BBstop_bot.mq413 скач.

#829

Исправьте кто то ошибку ....не могу скомпилировать...

MA-V1.mq412 скач.

#830


Исправьте кто то ошибку ....не могу скомпилировать...



Держи

MA-V1.mq415 скач.

#831

Всем доброго вечера. Подскажите пожалуйста, где я ошибся. В домашнем задании к 3 уроку при создании стоп-ордеров стабильно выдаётся "OrderModify ошибка 130"(неправильные стопы).
Также выкладываю задание к второму уроку. Там при удалении некоторых ордеров выскакивает ошибка "OrderDelete ошибка 4108" (некорректный номер тикета).
Файл SampleExpert1 - задание к второму уроку.
Файл Test3(Indicator) - задание к третьему уроку.

Test3Indicator.mq49 скач.
SampleExpert1.mq48 скач.

Изменено 15 апреля, 2014 пользователем NickWelder

#832

Здравствуйте
Можете подсказать как обьявлять и заполнять массив классов?

#833

Доброго времени суток всем!
Подскажите по уроку № 3. Как добавить в код советника переменные :
extern int StartHour = 10; // час начала работы
extern int StartMinute = 0; // минуты начала работы
extern int EndHour = 14; // час окончания
extern int EndMinute = 0; // минуты окончания

#834

Например во так:

Спойлер

[/ if(HourStart == TimeHour(TimeCurrent()))

и

if(HourEnd == TimeHour(TimeCurrent()))] это при целых значениях времени ,если нужны минуты,то условие надо писать другое.

#835


Например во так:

Спойлер

[/ if(HourStart == TimeHour(TimeCurrent()))

и

if(HourEnd == TimeHour(TimeCurrent()))] это при целых значениях времени ,если нужны минуты,то условие надо писать другое.


Будте добры! подскажите как прописать что б советник торговал в определенное время?
#836
Alekseevich, на форуме тьма советников, торгующих в разное время.

Изучайте чужих ботов, смотрите что как другие люди делали.

Учитесь исключительно самостоятельно.
Даже и не думайте, что кто-то вместо вас будет писать за вас программы или искать ваши ошибки.
На форуме 1 программист на 3000-5000 торгующих и все программисты крайне заняты.
#837

Всем добрый вечер. Во время выполнения домашнего задания к 4 уроку столкнулся с трудностью: при тестировании советника появляется ошибка "деление на ноль" и соответственно тестирование завершается. Алгоритм функции ModifyOrders() проверял, на первый взгляд всё верно. У самого не получается найти ошибку, поэтому прошу Вашей помощи. Выкладываю файл с выполненным домашним заданием из пункта 1.

Martin.mq48 скач.

#838

Здравствуйте
Можете подсказать как обьявлять и заполнять массив классов?

#839

А еще сть хорошая кнопочка F1. А там закладка содержание. А там ищите интересующую тему. Справка очень хорошая и есть примеры.

...может кто-то уже говорил такое... :-$


Добавлено: 16-04-2014 19:29:05

8-> не зря начинают обучение с блок-схем.... язык программирования - это уже инструмент....

Изменено 16 апреля, 2014 пользователем fv2500

#840



Например во так:

Спойлер

[/ if(HourStart == TimeHour(TimeCurrent()))

и

if(HourEnd == TimeHour(TimeCurrent()))] это при целых значениях времени ,если нужны минуты,то условие надо писать другое.


Будте добры! подскажите как прописать что б советник торговал в определенное время?

extern bool Hvkl = true;
вот держи: if ((Hvkl == true && (Hour() >= HaurStart && Hour()
#841

extern bool Hvkl = true;
вот держи: if ((Hvkl == true && (Hour() >= HaurStart && Hour()
Не получается, где ошибка?




extern bool Hvkl = true; // включение проверки времени
extern int StartHour = 5; // час начала времени
extern int EndHour = 9; // час окончания времени




int ticket, otype;
double TP, SL, price, PriceHigh, PriceLow ;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
// Если брокер работает с 5-ю цифрами
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;


}

return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if ((Hvkl == true && (Hour() >= StartHour && Hour() PriceHigh = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price,ATRMultiplier,ATRPeriod,Interpolate, 1, 0); //значение верхней линии
PriceLow = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price,ATRMultiplier,ATRPeriod,Interpolate, 2, 0); //значение нижней линии

// покупка
if (Ask {
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if(ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)== true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
// продажа
if (Bid >= PriceHigh && CountSell()== 0 )
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);


ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}



return(0);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int trade =OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); // MODE_TRADES - ьюцэю эх яшёрЄ№
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
count++;
}
}

return (count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int trade =OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); // MODE_TRADES - ьюцэю эх яшёрЄ№
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}

return(count);
}
#842

Сейчас маловато времени вникать в твой код,бегло посмотрел.я делал что то на подобие этого.попробуй переменные индикаторов вынести под старт,потом все остальное,если это весь код,то есть еще пара ошибок,посмотри сам код внимательно.

#843

Добрый день!
Помогите найти ошибку - не модифицируется ордер. ;;)
В журнале ошибка 130

P.S. Всё перепроверила несколько раз и не могу понять в чем причина!

17.04_raschet_sl.mq413 скач.

#844


Добрый день!
Помогите найти ошибку - не модифицируется ордер. ;;)
В журнале ошибка 130

P.S. Всё перепроверила несколько раз и не могу понять в чем причина!


Не модифицируется из за вот этой строчки TP = NormalizeDouble(SL*1.5, Digits);нужно посчитать количество пунктов от цены открытия до стоп лосса ,а потом только умножить на некое число.к сожалению я сам не знаю как это сделать.Пока не кто не подсказал.

#845


Добрый день!
Помогите найти ошибку - не модифицируется ордер. ;;)
В журнале ошибка 130
P.S. Всё перепроверила несколько раз и не могу понять в чем причина!


Ордер на продажу (OP_SELL), SL = dHigh, а вы хотите ТП сделать выше SL. Само собой такой приказ сервер принять не может. Так-же желательна проверка не слишком ли близко SL к текущей цене.
#846

Спасибо большое за помощь!!! =d> (такая глупая ошибка!)
Исправила. Всё работает.

#847

Привет
Помогите мне решить задачу
она такая:
1. Когда RSI()>=Х (установленного уровня) - поставить SELLLIMIT Y пункт выше тек.
или наоборот
2. Когда RSI()
extern double Lots = 0.01;
extern double StopLoss = 100;
extern double TakeProfit = 300;
extern int Distance = 50;
extern int Slippage = 3;
extern string comment = "Alert_RSI_Bot";
extern int magic = 777;
extern double BuyRSIPoint = 15;
extern double SellRSIPoint = 85;
extern int InpRSIPeriod = 14;

int i=0;
int ticket;
double price, BL_Price, SL_Price, TP, SL;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==3||Digits==5)
{
Slippage *=10;
Distance *=10;
StopLoss *=10;
TakeProfit *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(BuyRSIPoint >=iCustom(Symbol(),0,"RSI",InpRSIPeriod,0,i) && CountBuyLimit()==0)
{
BL_Price = Ask - Distance;
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, BL_Price, Slippage, 0, 0, comment, magic, 0, Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES)==true)
{
SL = NormalizeDouble(OrderOpenPrice()-StopLoss*Point,Digits);
TP = NormalizeDouble(OrderOpenPrice()+TakeProfit*Point,Digits);
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,0);
}
}
//Alert ("BUY");
//Print("Buy", Symbol(), "RSI }
//+---------------------------
if(SellRSIPoint {
SL_Price = Bid+Distance;
ticket=OrderSend(NULL,OP_SELLLIMIT,Lots,SL_Price,Slippage,0,0,comment,magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
SL = NormalizeDouble(OrderOpenPrice()+StopLoss*Point,Digits);
TP = NormalizeDouble(OrderOpenPrice()-TakeProfit*Point,Digits);
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,0);
}
}
}
//Alert ("BUY");
//Print("Buy", Symbol(), "RSI }
//+------------------------------------------------------------------+
int CountSellLimit()
{
int count=0;
for(int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
if(OrderType() == OP_SELLLIMIT) count++;
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuyLimit()
{
int count=0;
for(int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
if(OrderType() == OP_SELLLIMIT) count++;
}
return(count);
}

#848

kamolkurbonov, на первый взгляд, CountBuyLimit у тебя считает SellLimit-ы.
А так в чём требуется помощь?

Автор#849


kamolkurbonov, на первый взгляд, CountBuyLimit у тебя считает SellLimit-ы.
А так в чём требуется помощь?



копи-паст рулит...
ничего страшного, так часто бывает :)
#850

Добрый день, как обойти максимальный объем лотов установленный в ДЦ, спасибо!
Общий объем нужно дробить на объемы которые позволяет устанавливать ДЦ, но как это написать не понимаю, новичек, если это бональщина то извините :d

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025