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

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


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

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

Для покупных ордеров:
условие

if (BuyLimitCount() == 0 && BuyCount() ==0)


Проверки:
//+------------------------------------------------------------------+

int BuyLimitCount()
{
int count = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT)
{

count++;

}
}
return (count);
}

//+------------------------------------------------------------------+
int BuyCount()
{
int count = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{

count++;

}
}
return (count);
}

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

И для продаж
Уловие:

if (SellLimitCount() == 0 && SellCount() == 0)


Проверки:

//+------------------------------------------------------------------+
int SellLimitCount()
{
int count = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT)
{

count++;

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

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{

count++;

}
}
return (count);
}
//+------------------------------------------------------------------+


Я попробовал всё это заменить одним условием : if (OrdersTotal()
Да, согласен это может пригодиться в таких случаях когда один из ордеров не сможет открыться, и в этом случае откроется второй уже дублирующийся ордер.

Надобность этих больших проверок только в этом?


Добавлено: 21-09-2016 09:42:37

А сдесь, почему в условии сравнивается с "-1"?

ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, 3, sl, tp, "", Magic, 0, Blue);

if (ticket Print ("Не открылась покупка");


Я так понимаю что операция "OrderSend" при неудачи возвращает в "ticket" -1, а при успехе 1, правилино я думаю?
это любое действие так делает, любая операция?

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

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

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

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

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

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

Перейти

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

Перейти

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

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

FxVooDoo Supplement
Советник выставляет отложенные лимит-ордера на расстоянии N пунктов от точки входа вашего основного советника (по сути любого) и позволяет получить прибыль даже в тех случаях, когда позиция советника уходит в минус, а потом возвращается в плюс.
Можно использовать, если у вас в наличии имеется советник, который торгует в плюс, но его позиции часто уходят в минус, перед тем как закрыться с прибылью.

Допустим, какой-то ваш советник открыл позицию на продажу в точке X c тейк-профитом 70 пунктов.

«»

В точке Z тейк-профит сработал, однако перед этим цена добиралась до точки Y и наш ордер уходил в минус на целых 87 пунктов. Вспомогательный эксперт Supplement мог выставить отложенный ордер Sell Limit на этом же расстоянии от нашей точки входа и мы могли бы получить дополнительные 150 пунктов прибыли.
Если позиция главного (нашего) советника сразу идет в плюс, и цена не доходит до отложенных ордеров, выставленных Supplement, то все отложки удаляются при достижении тейк-профита. Supplement позволяет выставлять до трех отложенных ордеров на разных расстояниях от точки входа в позицию.

Описание настроек FxVooDoo Supplement
Voodoo_MagicNumber — мэджик (идентификатор) советника, позиции которого Supplement будет усреднять.
RiskPercentage — если все позиции, открытые и основным экспертом и Supplement в сумме достигнут этого уровня убытка (в процентах), то все позиции будут закрыты. По умолчанию стоит 100% — т.е. эта опция не задействована.
TotalPositions — сколько отложенных ордеров задействовать в работе Supplement.
Далее идет описание параметров для первого отложенного ордера Supplement, точно такие же настройки присутствуют и для 2-го и 3-го ордеров
Lots1 — размер лота для первого отложенного ордера Supplement
Distance1 — расстояние (в пунктах) от позиции нашего советника, на котором Supplement выставит первый отложенный ордер
TP1 — тейк-профит отложенного ордера
SL1 — стоп-лосс ордера
TrailingSL1 — вклвыкл тралл для первой отложки.
BEP1 — сколько пунктов прибавлять к цене открытия при переводе позиции в безубыток
Pips_forBEP_setup1 — уровень прибыли ордера (в пунктах) для его перевода в безубыток.
MagicNumber1 — мэджик для первого отложенного ордера. Нужен, чтобы наш главный советник не трогал ордера Supplement.
Comments — комментарий к отложенным ордерам. Может быть любым.

Данный советник мне почти идеально подходит но согласно моей стратегии у меня всегда ордера на покупку, соответственно для хеджа позиций мне нужно чтобы FxVooDoo Supplement выставлял отложенные ордера SELLSTOP, вместо них он выставляет BUYLIMIT


Добавлено: 21-09-2016 12:06:13



Поменял строки кода с 205 по 220 строку на следующий код
В итоге он начал правильно выставлять ордера SELLSTOP но не тралит их, а множит без конца
if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green);
if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red);
}
if (TotalPositions == 2) {
if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green);
if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red);
if (gi_320 >= 1 && gi_336 + gi_360 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots2, NormalizeDouble(Ask, Digits) - Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Green);
if (gi_324 >= 1 && gi_340 + gi_364 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots2, NormalizeDouble(Bid, Digits) + Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Red);
}
if (TotalPositions >= 3) {
if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green);
if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red);
if (gi_320 >= 1 && gi_336 + gi_360 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots2, NormalizeDouble(Ask, Digits) - Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Green);
if (gi_324 >= 1 && gi_340 + gi_364 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots2, NormalizeDouble(Bid, Digits) + Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Red);
if (gi_320 >= 1 && gi_344 + gi_368 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots3, NormalizeDouble(Ask, Digits) - Distance3 * gd_260, gd_268, 0, 0, Comments, MagicNumber3, 0, Green);
if (gi_324 >= 1 && gi_348 + gi_372 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots3, NormalizeDouble(Bid, Digits) + Distance3 * gd_260, gd_268, 0, 0, Comments, MagicNumber3, 0, Red);


FxVoodoo-supplement-1.mq4

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

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

Надобность этих больших проверок заключается в отыскании из всего количества ордеров (будь то лимитных или рыночных) именно тех, которые открыл конкретный советник. Ведь помимо ордеров советника вы можете непосредственно торговать в ручную или сторонний советник торгует непосредственно сам. И чтобы хоть как-то разграничить эти ордера и требуются проверки.

Функция OrderSend() "возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи". Таким образом, если ордер не открылся, то функция вернёт -1, а если открылся, то какое-то целое число, необязательно 1.

Я тоже только-только учусь. Лично мне помогает (как советовали в этой же ветки некоторые форумчане) использовать функции Print() или Comment() в те или иные моменты, чтобы убедиться самостоятельно в значениях тех или иных функций и разобраться таким образом с ними. Ещё на ранних стадиях очень рекомендуется использовать функцию GetLastError().

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

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

Вот бы еще хорошо было если бы он после себя неиспользуемые ордера закрывал, в случае если основная сова отработала без косяков.

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

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

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

В настройках указываем:
1. Время формирования коробки.
2. Значения уровней Фибоначчи.
3. Объем первой сделки.

После формирования коробки советник выставляет два стоп-ордера одинакового объема на максимуме и минимуме коробки с учетом спрэда + 1 пункт. Далее допустим открылся ордер бай(например 0.01). В этот момент необходимо удалить сэлл-стоп и выставить новый сэлл-стоп с объемом в три раза больше (если бай был 0.01, то сэлл-стоп должен быть 0.03). Когда в рынок входит ордер сэлл, необходимо выставить бай-стоп, объем увеличивается уже в два раза от противоположного последнего открытого ордера.(т.е. 0.06, 0.12, 0.24, и т.д.). Тейк профит для всех открытых ордеров выставляем на уровнях Фибоначчи. Стоп лосс для всех открытых ордеров ставим на уровне тейк профит +/- спрэд.(Таким образом все ордера закроются в один момент).
Допустим у нас в рынке несколько ордеров, суммарный тейк профит на первом уровне Фибоначчи становится меньше 10 пунктов значит тейк профит и стоп лосс переносим на следующий уровень Фибоначчи (профита).

Всем спасибо.

ScreenShot1.png

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

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

Глубоко уважаемые знатоки, возникла проблема при написании индикатора.
По заданию индикатор должен рисовать вертикальные линии, но он нарисует одну линию и больше не рисует хотя в журнале индикатор работает и должен выставлять ещё линии, что делать? помогите кто знает как правильно написать(желательно исправьте что не правильно и добавьте пояснения как что должно быть, если не затруднит)


//+------------------------------------------------------------------+
//| 1.mq4 |
//| Copyright 2016 |
//| https://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link "https://www."
#property version "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
extern double b=98; // верхняя граница
extern double c=2; // нижняя граница
double a;
int d=0;
string obj_name="0";
long current_chart_id=ChartID();
datetime time;

int OnStart()
{ a=iRSI(NULL,0,2,PRICE_CLOSE,1);
Comment(a);
if(a>b)
{ Print("Сигнал SELL");
time=TimeCurrent();
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrRed);
if(!ObjectCreate(current_chart_id,obj_name,OBJ_VLINE,time,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return(0);
}
d=d+1;
obj_name="0"+d;
}
if(a { Print("Сигнал BUY");
time=TimeCurrent();
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrBlue);
if(!ObjectCreate(current_chart_id,obj_name,OBJ_VLINE,time,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return(0);
}
d=d+1;
obj_name="0"+d;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---

//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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

Бьюсь над третьей домашкой. В советнике всё работает, только отложенные ордера селлстоп и байстоп при открытии тут же закрываются, хотя имеют свои стоплоссы и тэйкпрофиты.
Помогите пожалуйста разобраться как заставить отложки жить своей жизнью и игнорировать при открытии сигналы на закрытие? Код ниже.

Спойлер


----------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 300;
extern int StopLoss = 50;
extern int Magic = 111;
extern int Slippage = 3;
//-----------------------------------------------------
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;
//------------------------------------------------------
//--- input parameters stoh
input int InpKPeriod=5; // K Period
input int InpDPeriod=3; // D Period
input int InpSlowing=3; // Slowing
//-----------------------------------------------------
double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;
int ticket, ticket2;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков...
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора
PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора
MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика

// SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика

// iStochastic - спец функция для стоха

//------------------ Открытие и модификация селлов и установка страховочного байстопа-----------------------
if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
if (ticket>0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print ("Ошибка модификации селла");
} else Print ("Ошибка открытия селла");

ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного байстопа
if (ticket2>0)
{
if (OrderSelect(ticket2, SELECT_BY_TICKET))
if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0))
Print ("Ошибка модификации байстопа");
} else Print ("Ошибка открытия байстопа");

}
//----------------Открытие и модификация баев и установка страховочного селлстопа-----------------------------
if (CountBuy() == 0 && Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
if (ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0))
Print ("Ошибка модификации бая");
} else Print ("Ошибка открытия бая");

ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного sellстопа
if (ticket2>0)
{
if (OrderSelect(ticket2, SELECT_BY_TICKET))
if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0))
Print ("Ошибка модификации байстопа");
} else Print ("Ошибка открытия байстопа");
}
//----------------Сигнал на закрытие и закрытие селла и удаление байстопа -----------------------------
if (Ask 0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print ("Ошибка закрытия селла");

if (OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP)
if(!OrderDelete (ticket2))
Print ("Ошибка удаления байстопа");
}
}
}
//-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа---------------------
if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print ("Ошибка закрытия бая");

if (OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP)
if(!OrderDelete (ticket2))
Print ("Ошибка удаления селлстопа");
}
}
}
}
//+------------------------------------------------------------------+
int CountSell() // функция подсчёта селлов
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy() // функция подсчёта баев
{
int count = 0;

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

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

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

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

Здравствуйте. Подскажите как подправить код, чтобы корректно считал уровень безубытка с учетом всех свопов и комиссий. Спасибо.
for (int i=0; i if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()) {
profit = OrderProfit()+OrderSwap()+OrderCommission();
Profit += profit;
price = OrderOpenPrice();
lot = OrderLots();
if (OrderType()==OP_BUY ) {
ProfitB += profit;
price_b += price*lot;
b++;
lot_b+=lot;
CS_buy=CS_buy+OrderCommission()+OrderSwap();
}
if (OrderType()==OP_SELL) {
ProfitS += profit;
price_s += price*lot;
s++;
lot_s+=lot;
CS_sell=CS_sell+OrderCommission()+OrderSwap();
}
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
ProfitSumm += profit;
price_summ += price*lot;
summ++;
lot_summ+=lot;
CS_summ=CS_summ+OrderCommission()+OrderSwap();
}
}
}


double tick_value=MarketInfo(Symbol(),MODE_TICKVALUE);
if (b!=0) {
SLb = price_b/lot_b;
SLb = SLb - (CS_buy/(tick_value*lot_b))*Point;

}

if (s!=0) {
SLs = price_s/lot_s;
SLs = SLs + (CS_sell/(tick_value*lot_s))*Point;

}
double delta_lot=MathAbs(lot_b-lot_s);
if((b!=0 || s!=0) && delta_lot>0.0) {
SLbsumm= (price_b-price_s)/(lot_b-lot_s);
CS_buy=CS_buy+CS_sell;
if(lot_b>lot_s) {
SLbsumm = SLbsumm - (CS_buy/(tick_value*delta_lot))*Point;
}
if(lot_b SLbsumm = SLbsumm + (CS_buy/(tick_value*delta_lot))*Point;
}

}

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

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

Всем здравствуйте!

Такая засада: код получается рабочий, но компилятор выдает предупреждение: "possible loss of data due to type conversion", ругается на строку

datetime kTime=SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);


Между тем, SERIES_LASTBAR_DATE согласно документации имеет тип datetime.

Как эти предупреждения убрать?
Делаю в МТ5 build 1430
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день!
SeriesInfoInteger возвращает значение типа long, kTime имеет тип datetime. Значение, возвращаемое SeriesInfoInteger, необходимо привести к типу datetime.
Попробуйте сделать так: datetime kTime=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
Удачных торгов!

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

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

Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.
P.S. Если не туда написал, прошу прощения

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

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


Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.
P.S. Если не туда написал, прошу прощения



я думаю

Есть еще вариант: можно при подключении к счету просто ввести адрес и порт сервера. В этом случае Если вы не знаете адрес сервера, то его можно либо на сайте компании поискать,
Ссылка на сообщение
Поделиться на другие сайты

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


спасибо SilverKZ но не помогло так и рисует только одну линию а другие не хочет


Добрый день!
Преобразуйте числовое значение в текстовую строку
obj_name="0"+DoubleToString(d);
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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


Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.
P.S. Если не туда написал, прошу прощения


Alex333, да. Написали вы не совсем туда.
Все перечисленные брокеры используют платформу MT. Поэтому вы можете беспрепятственно открыть в одном терминале все счета.
[list type=decimal]
  • Установите "чистый" MT4 (http://www.metatrader4.com/ru)

  • Файл -> Подключиться к торговому счету


  • Последний шаг выполняйте сколько раз, сколько пожелаете подключенных счетов

    Добавлено: 29-09-2016 02:20:20


    Бьюсь над третьей домашкой. В советнике всё работает, только отложенные ордера селлстоп и байстоп при открытии тут же закрываются, хотя имеют свои стоплоссы и тэйкпрофиты.
    Помогите пожалуйста разобраться как заставить отложки жить своей жизнью и игнорировать при открытии сигналы на закрытие? Код ниже.

    Спойлер


    ----------------------------------------------------------+
    #property copyright "Copyright 2016, MetaQuotes Software Corp."
    #property link
    #property version "1.00"
    #property strict

    extern double Lots = 0.1;
    extern int TakeProfit = 300;
    extern int StopLoss = 50;
    extern int Magic = 111;
    extern int Slippage = 3;
    //-----------------------------------------------------
    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;
    //------------------------------------------------------
    //--- input parameters stoh
    input int InpKPeriod=5; // K Period
    input int InpDPeriod=3; // D Period
    input int InpSlowing=3; // Slowing
    //-----------------------------------------------------
    double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;
    int ticket, ticket2;

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков...
    {
    TakeProfit *=10;
    StopLoss *=10;
    Slippage *=10;
    }
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {

    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора
    PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора
    MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика

    // SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика

    // iStochastic - спец функция для стоха

    //------------------ Открытие и модификация селлов и установка страховочного байстопа-----------------------
    if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90)
    {
    ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
    if (ticket>0)
    {
    SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
    TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

    if (OrderSelect(ticket, SELECT_BY_TICKET))
    if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
    Print ("Ошибка модификации селла");
    } else Print ("Ошибка открытия селла");

    ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного байстопа
    if (ticket2>0)
    {
    if (OrderSelect(ticket2, SELECT_BY_TICKET))
    if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0))
    Print ("Ошибка модификации байстопа");
    } else Print ("Ошибка открытия байстопа");

    }
    //----------------Открытие и модификация баев и установка страховочного селлстопа-----------------------------
    if (CountBuy() == 0 && Ask {
    ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
    if (ticket>0)
    {
    TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
    SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

    if (OrderSelect(ticket, SELECT_BY_TICKET))
    if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0))
    Print ("Ошибка модификации бая");
    } else Print ("Ошибка открытия бая");

    ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного sellстопа
    if (ticket2>0)
    {
    if (OrderSelect(ticket2, SELECT_BY_TICKET))
    if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0))
    Print ("Ошибка модификации байстопа");
    } else Print ("Ошибка открытия байстопа");
    }
    //----------------Сигнал на закрытие и закрытие селла и удаление байстопа -----------------------------
    if (Ask 0)
    {
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
    Print ("Ошибка закрытия селла");

    if (OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP)
    if(!OrderDelete (ticket2))
    Print ("Ошибка удаления байстопа");
    }
    }
    }
    //-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа---------------------
    if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0)
    {
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
    if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
    Print ("Ошибка закрытия бая");

    if (OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP)
    if(!OrderDelete (ticket2))
    Print ("Ошибка удаления селлстопа");
    }
    }
    }
    }
    //+------------------------------------------------------------------+
    int CountSell() // функция подсчёта селлов
    {
    int count = 0;

    for (int trade = OrdersTotal()-1; trade>=0; trade--)
    {
    if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    count++;
    }
    }
    return(count);
    }
    //+------------------------------------------------------------------+
    int CountBuy() // функция подсчёта баев
    {
    int count = 0;

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

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




    У вас ошибка в задании функций OrderSend() и OrderModify().

    Объяснение: 50 пунктов, что вы ставите от цены у пятизначного брокера являются 5-ю пунктами. Поэтому, скорей всего, и получается почти мгновенное закрытие отложенных ордеров, потому что у вас SL = 5 пунктов (а вовсе не 50), а TP = 15 пунктов.

    Решение:
    [list type=decimal]
  • Добавьте SL и TP во внешние параметры

  • Добавьте соответствующие изменение в функцию OnInit(), чтобы при условии "трех- или пятизначности" брокера домножить SL и TP на 10

  • Измените функцию OrderSend()

  • Измените функцию OrderModify()



  • Если будут проблемы с этим ещё, то напишите. Изменено пользователем iPerevalov
    Ссылка на сообщение
    Поделиться на другие сайты

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



    Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.
    P.S. Если не туда написал, прошу прощения


    Alex333, да. Написали вы не совсем туда.
    Все перечисленные брокеры используют платформу MT. Поэтому вы можете беспрепятственно открыть в одном терминале все счета.
    [list type=decimal]
  • Установите "чистый" MT4

  • Файл -> Подключиться к торговому счету


  • Последний шаг выполняйте сколько раз, сколько пожелаете подключенных счетов

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

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

    У вас ошибка в задании функций OrderSend() и OrderModify().



    Спасибо. На самом деле вопрос решился введением второго мэджика для отложенных ордеров.
    В тестере теперь всё работает как было задумано.
    Спойлер

    #property strict

    extern double Lots = 0.1;
    extern int TakeProfit = 300;
    extern int StopLoss = 50;
    extern int Magic = 111;
    extern int Magic2 = 222; //что бы второй ордер не закрывался по сигналу
    extern int Slippage = 3;
    //-----------------------------------------------------
    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;
    //------------------------------------------------------
    //--- input parameters stoh
    input int InpKPeriod=5; // K Period
    input int InpDPeriod=3; // D Period
    input int InpSlowing=3; // Slowing
    //-----------------------------------------------------
    double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;
    int ticket, ticket2;

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков...
    {
    TakeProfit *=10;
    StopLoss *=10;
    Slippage *=10;
    }
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {

    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора
    PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора
    MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика

    // SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика

    // iStochastic - спец функция для стоха

    //------------------ Открытие и модификация селлов и установка страховочного байстопа-----------------------
    if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90)
    {
    ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
    if (ticket>0)
    {
    SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
    TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

    if (OrderSelect(ticket, SELECT_BY_TICKET))
    if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
    Print ("Ошибка модификации селла");
    } else Print ("Ошибка открытия селла");

    ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic2, 0, Green);// установка страховочного байстопа
    if (ticket2>0)
    {
    if (OrderSelect(ticket2, SELECT_BY_TICKET))
    if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0))
    Print ("Ошибка модификации байстопа");
    } else Print ("Ошибка открытия байстопа");

    }
    //----------------Открытие и модификация баев и установка страховочного селлстопа-----------------------------
    if (CountBuy() == 0 && Ask {
    ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
    if (ticket>0)
    {
    TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
    SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

    if (OrderSelect(ticket, SELECT_BY_TICKET))
    if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0))
    Print ("Ошибка модификации бая");
    } else Print ("Ошибка открытия бая");

    ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic2, 0, Green);// установка страховочного sellстопа
    if (ticket2>0)
    {
    if (OrderSelect(ticket2, SELECT_BY_TICKET))
    if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0))
    Print ("Ошибка модификации байстопа");
    } else Print ("Ошибка открытия байстопа");
    }
    //----------------Сигнал на закрытие и закрытие селла и удаление байстопа -----------------------------
    if (Ask 0)
    {
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
    Print ("Ошибка закрытия селла");

    if (OrderMagicNumber() == Magic2 && OrderType() == OP_BUYSTOP)
    if(!OrderDelete (ticket2))
    Print ("Ошибка удаления байстопа");
    }
    }
    }
    //-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа---------------------
    if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0)
    {
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
    if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
    Print ("Ошибка закрытия бая");

    if (OrderMagicNumber() == Magic2 && OrderType() == OP_SELLSTOP)
    if(!OrderDelete (ticket2))
    Print ("Ошибка удаления селлстопа");
    }
    }
    }
    }
    //+------------------------------------------------------------------+
    int CountSell() // функция подсчёта селлов
    {
    int count = 0;

    for (int trade = OrdersTotal()-1; trade>=0; trade--)
    {
    if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    count++;
    }
    }
    return(count);
    }
    //+------------------------------------------------------------------+
    int CountBuy() // функция подсчёта баев
    {
    int count = 0;

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

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

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

    Добрый вечер. Подскажите функцию, которая выведет на экран объем последней открытой позиции.
    Спасибо

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

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


    Добрый вечер. Подскажите функцию, которая выведет на экран объем последней открытой позиции.
    Спасибо


    Посмотрите этот код:
    Спойлер


    //+------------------------------------------------------------------+
    //найти лот последнего ордера
    double FindLastOrderLots()//лот последнего ордера
    {
    int oticket, ticketnumber = 0;
    double olot = 0;

    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS))
    {
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
    {
    oticket = OrderTicket();
    if(oticket>ticketnumber)
    {
    ticketnumber = oticket;
    olot = OrderLots();
    }
    }
    }
    }
    Comment("Лот последнего ордера = " + DoubleToStr(olot, 2));
    return(olot);
    }

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

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

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

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

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

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

    Войти

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

    Войти

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


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

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