Перейти к содержанию

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


Рекомендуемые сообщения

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

Уважаемый xbms, очень бы хотелось посмотреть видео о создании советников, использующих стоп-лоссы, т.е. о стратегиях для советников.

Спасибо Вам большое за проделанную работу))

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано



о создании советников, использующих стоп-лоссы.



Это максимально разобрано в каждом из уроков. x_x


Вы не правы, стратегия у всех советников основана на принципе мартингейла. Хотелось бы послушать процесс создания стратегии без усреднения
Ссылка на сообщение
Поделиться на другие сайты

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

А вам что не понятно, как и от куда рассчитывать стоп лосс ? Мне допустим было ясно и без языка программирования.Так вот там, то же самое, в уроках есть как ставить стопы и как тралить,почти любым способом.Пересмотрите урок как добавить в советник трелинг стоп. Я думаю господин xbms не случайно взял пример написания советника на мартине или сеточник,для начинающего это довольно сложный код.там довольно в полной мере описывается логика программы.что за чем должно следовать и все вычисления.посидеть подумать можно написать простенький код без усреднения. В общем думайте,голова для этого дана,не только в нее ложку заталкивать.

Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

:-HДобрый день.Искал в ветке, но так и не нашел. Может кто подскажет, как модифицировать к примеру 2 ордера на разных валютах по принципу мартингейла?На одной валюте понятно, а так чтобы получить б/у по 2 парам не понятно.Спасибо за любой ответ.

Ссылка на сообщение
Поделиться на другие сайты

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

Здраствуйте, вы не могли бы мне помочь, Пишу советник, смысл в том, чтобы при прохождении цены в какую либо сторону открыть ордер в сторону движения цены. Если цена развернётся и сработает СтопЛосс, открылся новый ордер от стопа, опять по движению ценыС теми же СЛ и ТП. Первый ордер открываеться без проблем, а второе условие не срабатывает. Помогите в чём ошибка (((

Спойлер

//+------------------------------------------------------------------+
//| Plan B 3.mq4 |
//| C |
//| http:/ |
//+------------------------------------------------------------------+
#property copyright "C"
#property link "http:/"
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 150;
extern int StopLoss = 50;
extern int Slippage = 5;
extern string comment = "Tma Bot";
extern int Magic = 12345;


extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigt, PriceLow, SL, TP, price;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}


return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigt = 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 >= PriceHigt && CountBuy() + CountSell() == 0)
{

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 {
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, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}

}


if (CountTrades() == 0 && FindLastOrderType() == OP_SELL && Ask >= NormalizeDouble(FindLastPrice(OP_SELL) + StopLoss*Point, Digits))
{

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, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}



}

if (CountTrades() == 0 && FindLastOrderType() == OP_BUY && Bid {

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);


}



}
}
//+------------------------------------------------------------------+
int CountBuy()
{
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_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+

int CountSell()
{
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_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for( int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}

//+------------------------------------------------------------------+

int FindLastOrderType()
{
for (int i = OrdersTotal()-1; i>=0; i-- )
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}


//+------------------------------------------------------------------+
int CountTrades()

{
int count = 0;
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}
return(count);


}



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

Спойлер

//+------------------------------------------------------------------+
//| Plan B ch3.mq4 |
//| C |
//| http:/ |
//+------------------------------------------------------------------+
#property copyright "C"
#property link "http:/"
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 60;
extern int StopLoss = 20;
extern int inTakeProfit = 20;
extern int inStopLoss = 15;
extern int Step = 21;
extern int Slippage = 3;
extern int Magic = 12345;
extern string comment = "Делаю Деньги";
extern double Multipler = 2;

extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double TP, SL, SL2, TP2, inTP, inSL, inTP2, inSL2, price, lastlot, PriceHigt, PriceLow;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Step *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

PriceHigt = 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 >= PriceHigt && CountBuy() + CountSell() == 0)
{

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 {
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, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}

}

else
{
int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if((price - Bid)/Point >= StopLoss)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit * Point, Digits);
SL = NormalizeDouble(OrderOpenPrice() + StopLoss * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}
}

int order_type = FindLastOrderType();
if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL);
if((Ask - price)/Point >= StopLoss)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Red);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit * Point, Digits);
SL = NormalizeDouble(OrderOpenPrice() - StopLoss * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}

}
//+------------------------------------------------------------------+
int CountBuyStop()
{
int count = 0;

for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP )
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+

int CountSellStop()
{
int count = 0;

for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP )
count ++;
}
}
return(count);

}
//+------------------------------------------------------------------+
void DeleteOrders()
{
for(int trade=OrdersTotal() -1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket(), Black);
}
}
}
//+------------------------------------------------------------------+
int CountBuy()
{
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_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+

int CountSell()
{
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_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
double oldlots;
int oldticket;

ticket = 0;
for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype )
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for( int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}

//+------------------------------------------------------------------+

int FindLastOrderType()
{
for (int i = OrdersTotal()-1; i>=0; i-- )
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}


//+------------------------------------------------------------------+
int CountTrades()

{
int count = 0;
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}
return(count);


}



Изменено пользователем Алексей7779000
Ссылка на сообщение
Поделиться на другие сайты

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

раставь GetLastError(); и принты после каждого условия и смотри журнал найдёшь где глючит
также обнуление переменных в функциях oldopenprice и тд и тп
размер лота проверь если на твоём типе счёта мин лот 0.1 то в настройках должно быть 0.1 а не 0.01

Изменено пользователем pegaskrs
Ссылка на сообщение
Поделиться на другие сайты

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


:-HДобрый день.Искал в ветке, но так и не нашел. Может кто подскажет, как модифицировать к примеру 2 ордера на разных валютах по принципу мартингейла?На одной валюте понятно, а так чтобы получить б/у по 2 парам не понятно.Спасибо за любой ответ.



Вместо Symbol() в функции модификации указываешь какой символ необходимо модифицировать.
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, помогите пожалуйста...

Если мне нужно взять данные например с ЕМА 5 наложенного на график цены то я делаю так:

double Tg;

Tg =iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,i);

подскажите плз. как взять данные индикатора MA который наложен например на RSI и берёт данные не с графика цены, а с осцилятора RSI и строится в нём по его данным, т.е. Apply to : First Indicator's Data

Заранее спасибо.

Ссылка на сообщение
Поделиться на другие сайты

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

Ошибка в том, что когда ордер закрывается то он уже не в списке активных, а истории.
Поэтому нужно там его искать:


// retrieving info from trade history
int i,accTotal=OrdersHistoryTotal();
for(i=0;i {
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
// работа с ордером ...
}

Ссылка на сообщение
Поделиться на другие сайты

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

Что-то не видно активности, решений задачки по уроку... :)
Урок с классами показался тяжёлым?
Дальше будет ещё сложней... наследование, инкапсуляция и т.д.
Во сколько новых слов :)

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Господин xbms,Сергей дайте время переворотить информацию,допустим я сейчас пытаюсь
сложить в кучу ваши два урока.Но пока не очень успешно,я пока сам код не напишу хотя бы какой нибудь который работать будет.Подчеркиваю,свой то есть свою идею. Я не пойму как это все работает,списать легко,разобраться в этом сложнее.По этому наверное нет не кого.


Добавлено: 22-03-2014 14:17:07

Господин XBMS у меня просьба к вам такого плана,могли вы помочь разобраться с кодом.
На одном из форумов один отзывчивый программист набросал мне часть кода.как раз получается из области ваших не давних уроков.В сообщение выше я писал уже причину не понимания пока всего этого.Я хотел написать функцию наверное известной вам ТС Кукловод открытия хотя бы одной корзины ордеров.Просьба заключается в следующем,я совсем не понял как там работать все должно.там явно чего то не хватает.Подскажите чего ? Если вас не затруднит посмотреть код и построчно дать комментарии,ото я там совсем заблудился ! >:d :(

Спойлер

[
string Smbl[];
int CntBuy[],CntSell[];

void OnStart()
{
if(CountBuySell(Smbl, CntSell, CntBuy))
for(int i=0; i, CntBuy, CntSell);
}
//---------------------------------------------------------------++
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
int ot,n,N=0,f=0,cb=0,cs=0;
string symbol;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

ot=OrderType()+1; if(ot>2) continue; // пропускаем лимит ордера
symbol=""; symbol=OrderSymbol(); if (symbol=="") continue; // убедились что символ выбран
f=0; cb=0; cs=0; // обнулили счетчики и флаг символа
for (n=0; n if (f==0) // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
{
N++;
ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
}

if(ot==1) cb++; // OP_BUY для выбранного символа
else cs++; // OP_SELL

// перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
// такоим образом для каждого индекса всех 3 массивов будет соответствовать конкретный символ и количество позиций покупки и продажи для него
for (n=0; n
}
}
if(N>0) return(1); // есть открытые позиции
return(0); // позиций нет
}

//-------------------------------------------------------------------------++
]

Изменено пользователем denis77515
Ссылка на сообщение
Поделиться на другие сайты

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


Господин xbms,Сергей дайте время переворотить информацию,допустим я сейчас пытаюсь
сложить в кучу ваши два урока.Но пока не очень успешно,я пока сам код не напишу хотя бы какой нибудь который работать будет.Подчеркиваю,свой то есть свою идею. Я не пойму как это все работает,списать легко,разобраться в этом сложнее.По этому наверное нет не кого.


Добавлено: 22-03-2014 14:17:07

Господин XBMS у меня просьба к вам такого плана,могли вы помочь разобраться с кодом.
На одном из форумов один отзывчивый программист набросал мне часть кода.как раз получается из области ваших не давних уроков.В сообщение выше я писал уже причину не понимания пока всего этого.Я хотел написать функцию наверное известной вам ТС Кукловод открытия хотя бы одной корзины ордеров.Просьба заключается в следующем,я совсем не понял как там работать все должно.там явно чего то не хватает.Подскажите чего ? Если вас не затруднит посмотреть код и построчно дать комментарии,ото я там совсем заблудился ! >:d :(

Спойлер

[
string Smbl[];
int CntBuy[],CntSell[];

void OnStart()
{
if(CountBuySell(Smbl, CntSell, CntBuy))
for(int i=0; i, CntBuy, CntSell);
}
//---------------------------------------------------------------++
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
int ot,n,N=0,f=0,cb=0,cs=0;
string symbol;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

ot=OrderType()+1; if(ot>2) continue; // пропускаем лимит ордера
symbol=""; symbol=OrderSymbol(); if (symbol=="") continue; // убедились что символ выбран
f=0; cb=0; cs=0; // обнулили счетчики и флаг символа
for (n=0; n if (f==0) // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
{
N++;
ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
}

if(ot==1) cb++; // OP_BUY для выбранного символа
else cs++; // OP_SELL

// перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
// такоим образом для каждого индекса всех 3 массивов будет соответствовать конкретный символ и количество позиций покупки и продажи для него
for (n=0; n
}
}
if(N>0) return(1); // есть открытые позиции
return(0); // позиций нет
}

//-------------------------------------------------------------------------++
]



Денис, теперь уже мне нужно время разобраться.
Т.к. я какое-то время не следил за форумом, ибо некогда, и по сему ТС "Кукловод" мне незнакома :)
Как только найду время - разберусь и попробую помочь.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Как можно исправить ошибки в индикаторах для нового терминала, содержащих char ?

if((char > 96 && char 223 && char s = StringSetChar(s, lenght, char - 32);
else
if(char > -33 && char s = StringSetChar(s, lenght, char + 224);
lenght--;

T3_clean.mq4

Изменено пользователем Юла
Ссылка на сообщение
Поделиться на другие сайты

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


Как можно исправить ошибки в индикаторах для нового терминала, содержащих char ?

if((char > 96 && char 223 && char s = StringSetChar(s, lenght, char - 32);
else
if(char > -33 && char s = StringSetChar(s, lenght, char + 224);
lenght--;



в данном случае char идёт как переменная... её можно просто назвать по другому, ну или например добавить символ подчёркивания "_", будет как "char_", хотя в этом коде и других проблем хватает...
Ссылка на сообщение
Поделиться на другие сайты

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

Всем Привет!
Может кто подсказать, где я напортачил.
Про бывал написать советник на основе индикатора ATR_the_bat пока без фибоначи просто при пробитии линии заключал сделку, но если цена идет выше линии он открывает море ордеров.
Писал на основе 3 урока.
За ранее спасибо!
Ну зачем эти символы при каждом сообщение и т.д. не захочешь общаться даже после это чуши

ATR_bot.mq4
ATR_the_bat.mq4

Ссылка на сообщение
Поделиться на другие сайты

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

Вот смотри в строчке if (Ask >=PriceHigh && CountSell() == 0) уже ошибка.
if (Ask >=PriceHigh если вот это условие не выполняется ,то вот это && CountSell() == 0) игнорируется совсем.Тебе нужно было записать условие проверки ордеров как во всех уроках if( OrdersTotal() == 0 && CountBuy() == 0 && CountSell() == 0)
{
.............
}

Ссылка на сообщение
Поделиться на другие сайты

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


Вот смотри в строчке if (Ask >=PriceHigh && CountSell() == 0) уже ошибка.
if (Ask >=PriceHigh если вот это условие не выполняется ,то вот это && CountSell() == 0) игнорируется совсем.Тебе нужно было записать условие проверки ордеров как во всех уроках if( OrdersTotal() == 0 && CountBuy() == 0 && CountSell() == 0)
{
.............
}


спасибо сейчас гляну

Добавлено: 24-03-2014 11:14:20

А почему в первом варианте открывал позицию по линии индюка, а после исправления сразу и после закрытия тоже в этом же направлении Изменено пользователем 35aleks
Ссылка на сообщение
Поделиться на другие сайты

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

Со скобками подумать надо,я сейчас попробовал накидать эту сову,у меня то же получилось,что открывает только Sell ордера.условие на пакупку не выполняются,надо подумать почему ? Посмотри если есть желание.

Спойлер

[//+------------------------------------------------------------------+
//| 1.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Klonoz Denis 06.03.2014"
#property link "skype-denis77515"
#property version "1.00"
#property strict

extern double Lots = 0.01;
extern int TakeProfit = 100;
extern int StopLoss = 30;
extern int Slippage = 5;
extern string comment = "ATR boot";
extern int Magic = 123;
extern string indi = "Prametr indik";
extern int BackPeriod = 1000;
extern int ATRPeriod = 3;
extern double Factor = 3;
extern bool TypicalPrice = false;

double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(Symbol(), 0, "ATR_the_bat", BackPeriod, ATRPeriod, Factor,0,0);
PriceLow = iCustom(Symbol(), 0, "ATR_the_bat", BackPeriod, ATRPeriod, Factor,1,0);

if(OrdersTotal()==0 && CountBuy() == 0 && CountSell() == 0)
{
if(Ask>=PriceHigh)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
}
if (ticket > 0)
ModifyOrderBuy();


if (Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
}
if (ticket > 0)
ModifyOrderSell();


}//if (OrdersTotal()==0 && CountBuy() == 0 && CountSell() == 0)



}
//+------------------------------------------------------------------+
void ModifyOrderBuy()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()== OP_BUY)
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);

}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrderSell()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()== OP_SELL)
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);

}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
{
if(OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
{
if(OrderType() == OP_BUY)
count++;
}
}
return(count);
}
]

Ссылка на сообщение
Поделиться на другие сайты

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

а у меня только бай


Добавлено: 25-03-2014 06:52:02

Все разобрался. Там нужно поменять местами CountSell с CountBuy.
Кто может подсказать как прикрутить фибо уровни что бы по ним открывались отложники?

Добавлено: 25-03-2014 07:04:50

с фибо разобрался как сделаю советник выложу Изменено пользователем 35aleks
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте! :)

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

Пример кода

//+------------------------------------------------------------------+
int CountSell()
{
for(int trade = OrdersTotal() -1; trade >=0; trade--)
{
[glow=yellow,2,300]OrderSelect[/glow](trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
Count++;
}
}
return(Count);
}
//+------------------------------------------------------------------+
void CloseOrders()
{
for(int trade=OrdersTotal()-1; trade >= 0; trade--)
{
[glow=yellow,2,300]OrderSelect[/glow](trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
[glow=yellow,2,300]OrderDelete[/glow](OrderTicket(), Black);
}
}
}
//+------------------------------------------------------------------+


warning.jpg

Изменено пользователем Redeemer
Ссылка на сообщение
Поделиться на другие сайты

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

Я не понял, как работает ChartID

код из справки:

   
string obj_name="label_object";
long current_chart_id=ChartID();
//--- создаем объект типа label
if(!ObjectCreate(current_chart_id,obj_name,OBJ_LABEL,0,0,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return;
}


тупо не работает:
2014.03.26 17:11:24.105 2014.01.02 09:59 Buttons USDCHF,H1: Ошибка создания объекта: code #4202

Код ошибки #4202 из той же справки гласит: 4202 ERR_OBJECT_DOES_NOT_EXIST Объект не существует
Под объектом, видимо, имеется в виду несуществующий график.

При этом, если вместо current_chart_id подставить 0
т.е. вместо:
long current_chart_id=ChartID();
написать
long current_chart_id=0;

, то всё работает.

Как это понимать? Кто из нас глючит?

Добавлено: 26-03-2014 13:48:02


Спойлер

Я не понял, как работает ChartID

код из справки:

   
string obj_name="label_object";
long current_chart_id=ChartID();
//--- создаем объект типа label
if(!ObjectCreate(current_chart_id,obj_name,OBJ_LABEL,0,0,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return;
}


тупо не работает:
2014.03.26 17:11:24.105 2014.01.02 09:59 Buttons USDCHF,H1: Ошибка создания объекта: code #4202

Код ошибки #4202 из той же справки гласит: 4202 ERR_OBJECT_DOES_NOT_EXIST Объект не существует
Под объектом, видимо, имеется в виду несуществующий график.

При этом, если вместо current_chart_id подставить 0
т.е. вместо:
long current_chart_id=ChartID();
написать
long current_chart_id=0;

, то всё работает.

Как это понимать? Кто из нас глючит?




Нашелся ответ опытным путем. Это работает в он-лайне. В тестере не хочет. События, кажется, тоже в тестере не работают.

Добавлено: 26-03-2014 13:48:55

это ужасно :(( Изменено пользователем fv2500
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Можете подсказать как прописать что бы профит был в валюте, не в пунктах?
по общему балансу счета что бы все закрыл

Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...