Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 121
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте. Подскажите пожалуйста как в коде советника MQL4 прописать такое правило открытия ордера, в рынке должен быть ордер с определенным магиком, если такого ордера нет, то и советник ничего не открывает по своему основному алгоритму. в переменных прописывается этот магик.
Примерно так можно:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Как сделать возможным заполнение массива пользователем?
Как сделать возможным заполнение массива пользователем?
Приветствую, есть индикатор, который отрисовывает историю ордеров на графике, код:
//| history.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
extern int MagicNumber = 1110;
extern datetime HistoryOrdersFromDateTime = 0;
extern color SellColor = clrRed;
extern color BuyColor = clrBlue;
extern color ProfitColor = clrWhite;
extern bool DeleteHistoryOrders = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start()
{
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
if(HistoryOrdersFromDateTime<OrderCloseTime())
{
if((TimeCurrent()-OrderCloseTime())>60)
HistoryOrders();
}
}
}
}
void HistoryOrders()
{
int CountOrders=0;
double b=OrderOpenPrice(), d=OrderClosePrice(), lots=OrderLots(), Profit=0;
datetime a=OrderOpenTime(), c=OrderCloseTime(), close_time;
string Ticket=(string)OrderTicket(), type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
color col=SellColor;
if(OrderType()==0) {col=BuyColor; type="Buy";}
//Расчет профита
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()<=1)
{
close_time=OrderCloseTime();
if(c<=close_time+60 && c>=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
Ticket=(string)OrderTicket();
}
}
}
//Размер фона
for(int i=2; i<StringLen(DoubleToString(Profit,2)); i++)
StringAdd(Background,"g");
if(DeleteHistoryOrders==false)
{
//Начальная точка
ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJ_ARROW,0,a,b);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+"\n"+comment,OBJPROP_ARROWCODE,1);
//Линия
ObjectCreate("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJ_TREND,0,a,b,c,d);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_WIDTH,1);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_STYLE,STYLE_DOT);
ObjectSet("#"+Ticket+" "+DoubleToString(b,Digits)+" -> "+DoubleToString(d,Digits),OBJPROP_RAY,0);
//Конечная точка
ObjectCreate("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJ_ARROW,0,c,d);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_COLOR,col);
ObjectSet("#"+Ticket+" "+type+" "+DoubleToString(lots,2)+" "+symbol+" at "+DoubleToString(b,Digits)+" close at "+DoubleToString(d,Digits),OBJPROP_ARROWCODE,3);
//Фон профита
ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
ObjectSetText("#"+Ticket+" Background",Background,10,"Webdings",col);
ObjectSet("#"+Ticket+" Background",OBJPROP_PRICE1,d);
ObjectSet("#"+Ticket+" Background",OBJPROP_TIME1,c+Period());
//Профит
ObjectCreate("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJ_TEXT,0,c,d);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_ANCHOR,ANCHOR_LOWER);
ObjectSetText("#"+Ticket+" Profit: "+DoubleToString(Profit,2),DoubleToString(Profit,2),10,"Arial",ProfitColor);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_PRICE1,d);
ObjectSet("#"+Ticket+" Profit: "+DoubleToString(Profit,2),OBJPROP_TIME1,c+Period());
} else ObjectsDeleteAll(0, "#"+Ticket+" ");
}
void OnDeinit(const int reason)
{
for(int i=0; i<OrdersHistoryTotal(); i++)
{
DeleteHistoryOrders=true;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
HistoryOrders();
}
}
Единичный сделки индикатор отрисовывает правильно (линия>фон>профит), а вот в отображении закрытых сеток ордеров есть небольшой "косяк" (скрин прилагаю), на фон и профит накладываются линии (линия(1)>фон>профит>линия(2)>линия(3)>линия(4) . . . ).
Должно быть так: (линия(1)>линия(2)>линия(3)>линия(4) . . . >фон>профит). Различные танцы с бубном не привели к успеху, помогите исправить.
А кто его ещё может заполнить, кроме пользователя?
Я про то, как его заполнить через настройки. Допустим через строку, а потом её значение засунать в массив...
Я про то, как его заполнить через настройки. Допустим через строку, а потом её значение засунать в массив...
Примерно так можно:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Примерно так можно:
void OnTick()
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Примерно так можно:
{
Comment( IsCount(ORDER_TYPE_BUY_STOP, 5) ); // type - тип, mg - magic
}
//------- Вернёт количество
int IsCount(int type, int mg) {
int p=0;
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mg) {
if(OrderType()==type) {
p++;
}}}}
return(p);
}
Спасибо большое, попробую.
Вроде вот
Спасибо!
ORDER_TYPE_BUY_STOP в редакторе MQL4 подсвечивается, в справке MQL4 нету. Вопрос: а работает в MQL4, соответствует типу OP_BUYSTOP ? Просто проверить пока нет времени.
Да, 100% работает, сейчас только так и пишу. Сейчас очень многое перекочевало с пятёрки, на четвёрку.
Даже такое работает, хотя раньше компилятор ругался, это трендовая линия
ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,p1);
ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,1,t2);
ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,1,p2);