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

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


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

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

Объясните чайнику, почему не работает. Сова должна выставлять максимум по 4 ордера (любых), однако, после появления первого ордера, счётчик ордеров сразу становится == 5 и больше одного ордера, соответственно, не появляется. Непонимаю, где косяк в алгоритме :-b

Система_Черепах+Tral_mod001.mq4
Канал_Дончиана.mq4

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Объясните чайнику, почему не работает. Сова должна выставлять максимум по 4 ордера (любых), однако, после появления первого ордера, счётчик ордеров сразу становится == 5 и больше одного ордера, соответственно, не появляется. Непонимаю, где косяк в алгоритме :-b



grabli, собсно вот здесь и прописано:

Спойлер

if ( BuyStop

if (SellStop GreenChannelLower + 0.0005)




Если проблема в том, что должен выставлять 4, а выставляет 5, то просто поставьте либо "BuyStop Изменено пользователем DreamWorks
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Ордера открываются, как и прописано в условии по 4 в оба направления.


Также у тебя есть ошибки в условии циклов.

/////////////////////////
// Фильтр выхода по времени (тайм-аут)
/////////////////////////

if (СтопЛосс_в_барах > 0)
{
//определение времени открытия сделки
for (i = OrdersTotal(); i >= 0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Магик_номер)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
break;
}
}
}


И здесь

if(closedonch) {
for (i = OrdersTotal(); i >= 0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Магик_номер)
{
if (OrderType() == OP_BUY)
{
if (Bid }
if (OrderType() == OP_SELL)
{
if (Bid > RedChannelHiger) {OrderClose(OrderTicket(), OrderLots(), Ask, 5, Red);}
}
}
}

}


Должно быть i = OrdersTotal() - 1
Хоть это и не повлияет на работу советника в твоём случае, но всё же.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, появилась необходимость использование SMMA (smoothed moving average) на нестандартном таймфрейме т.е. сделать то же что делает iMA только для ценового ряда из моего массива цен. Все мои попытки разобраться с тем ка считается SMMA используя материалы опубликованные на сервере Metaquotes и исходник Custom Moving average.mq4 к положительному результату не привели. Подскажите как рассчитать значение SMMA (к примеру 5, close) в ручную или любой способ расчета для ценового ряда из моего массива

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

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

Спасибо Всем. Тему можно считать закрытой.
Все пишут советников кому как удобно. Я лучше пару строк "лишнего" кода напишу, зато потом мне проще будет разобраться в нем и в голове четкое представление будет. Имхо... :)

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

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

Здравствуйте!
Можете помочь с кодом в советник?
Нужен код который фиксирует баланс=средства при отсутствии открытых ордеров и при достижении прироста средств на процент/долю к первоначальному балансу (указывается в настройках советника) закрывает все ордера (и рыночные и отложенные) и перезапускает работу советника заново.
Спасибо!

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

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


Здравствуйте!
Можете помочь с кодом в советник?
Нужен код который фиксирует баланс=средства при отсутствии открытых ордеров и при достижении прироста средств на процент/долю к первоначальному балансу (указывается в настройках советника) закрывает все ордера (и рыночные и отложенные) и перезапускает работу советника заново.
Спасибо!


Вот набросал такой код:
Спойлер


//+------------------------------------------------------------------+
//| CloseProfitPercent.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern int Magic = 0;//магический номер
extern double ProfitPercent = 10;//целевой профит в %
double acc_balance;//баланс аккаунта когда нет открытых позиций
double acc_profit;//текущий профит
double difference;//изменение баланса аккаунта

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

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

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Count() == 0)//если нет открытых позиций
{
acc_balance = AccountInfoDouble(ACCOUNT_BALANCE);//запомним баланс аккаунта
}

//условия для входа, советник открывает позиции
//
//



//сравниваем текущий баланс с начальным
acc_profit = AccountInfoDouble(ACCOUNT_PROFIT);//текущий профит

difference = NormalizeDouble((((acc_balance + acc_profit) - acc_balance)/acc_balance)*100, 1);

if(difference >= ProfitPercent)
{
//закроем все позиции и удалим отложки
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
{
bool res = OrderClose(OrderTicket(), OrderLots(), Bid, 50, clrNONE);
if(res == false) Print("Ошибка закрытия позиции № ", GetLastError());
}

if(OrderType() == OP_SELL)
{
bool res = OrderClose(OrderTicket(), OrderLots(), Ask, 50, clrNONE);
if(res == false) Print("Ошибка закрытия позиции № ", GetLastError());
}

if(OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLSTOP || OrderType() == OP_SELLLIMIT)
{
bool res = OrderDelete(OrderTicket(), clrNONE);
if(res == false) Print("Ошибка удаления отложенного ордера № ", GetLastError());
}
}
}
}
}

Comment("Начальный баланс: ", acc_balance, "\n"
"Текущий профит: ", acc_profit , "\n"
"Заданный процент прибыли: ", ProfitPercent , "\n"
"Текущий процент прибыли: ", difference, "\n"

);

}//void OnTick()

//+------------------------------------------------------------------+
//функция подсчета ордеров |
//+------------------------------------------------------------------+
int Count()
{
int count=0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType()==OP_BUY || OrderType() == OP_SELL) count++;
}
}
}
return(count);
}
Изменено пользователем Sergey Forex
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.

Нашел несколько статей по парсингу страниц в поисках нужной информации.
Но все описанные там примеры работали только на http сайтах (с помощью библиотеки wininet.dll).
Попытка открыть сайты с ssl заканчивались неудачей.
Вопрос. Можно ли парсить https сайты с помощью данной библиотечки, либо другой способ ?

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

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


Господа программисты. Как сделать так, чтобы сделка открывалась с началом новой свечи. Заранее, спасибо


Пользуйтесь поиском в теме.
http://tlap.com/forum/ugolok-programmista/13/obuchenie-yazyku-mql4-pod-metatrader-4/4034/?do=findComment&comment=342480
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Проверил, никаких проблем с https у wininet нет

Test.mq4


#property copyright ""
#property link ""
#property version "1.00"
#property strict

#include
#include

#import "wininet.dll"
int InternetOpenW(string,int,string,string,int);
int InternetOpenUrlW(int,string,string,int,int,int);
int InternetReadFile(int,uchar &arr[],int,int &arr[]);
int InternetCloseHandle(int);
#import

int OnInit(void){
int read[1];
uchar Buffer[101];
string sData;
string url="https://www.google.com/finance";

int HttpOpen=InternetOpenW(" ",0," "," ",0);
int HttpRequest = InternetOpenUrlW(HttpOpen, url, NULL, 0, 0, 0);

while(true){
InternetReadFile(HttpRequest,Buffer,100,read);
string strThisRead = CharArrayToString(Buffer,0,read[0],CP_UTF8);
if(read[0] > 0)
sData += strThisRead;
else
break;
}
if(HttpRequest>0) InternetCloseHandle(HttpRequest);
if(HttpOpen>0) InternetCloseHandle(HttpOpen);

Print("### ",sData);
return(INIT_SUCCEEDED);
}

void OnTick(){

}



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

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

Добрый день, возник такой вот вопрос: если у меня ордер закрывается по OrderClose, то можно нарисовать стрелку закрытия и между стрелкой открытия протянется пунктирная линия, а как тоже самое реализовать если закрытие идет по SL не виртуальному соответственно? Просто удобно, когда есть пунктир между открытием и закрытием.


Добавлено: 09-03-2017 12:16:41

Пока наваял такую вещь

if(ExistPosition(1) || ExistPosition(2))
{
FlagOpenPos=True;
}
else if(FlagOpenPos)
{
if(OrderSelect(TicketLastPos,SELECT_BY_TICKET))
{
string TypeOrder="unknown";
if(OrderType()==0) TypeOrder="buy";
else if(OrderType()==1) TypeOrder="sell";
string InfoOrder=StringConcatenate("#",OrderTicket()," ",TypeOrder," ",OrderLots()," ",Symbol()," at ",OrderOpenPrice()," close at ",OrderClosePrice());
string InfoOrder2=StringConcatenate("#",OrderTicket()," ",OrderOpenPrice()," -> ",OrderClosePrice());
if(OrderType()==0)
{
ObjectCreate(ChartID(),InfoOrder2,OBJ_TREND,0,OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice());
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_COLOR,clOpenBuy);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_RAY_RIGHT,False);
if(OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_STOP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>OrderStopLoss() && OrderClosePrice()=OrderOpenPrice())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_UP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>OrderStopLoss() && OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_DOWN,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>=OrderTakeProfit())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_CHECK,0,OrderCloseTime(),OrderClosePrice());
}
}
else if(OrderType()==1)
{
ObjectCreate(ChartID(),InfoOrder2,OBJ_TREND,0,OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice());
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_COLOR,clOpenSell);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_RAY_RIGHT,False);
if(OrderClosePrice()>=OrderStopLoss())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_STOP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()OrderTakeProfit() && OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_UP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()OrderTakeProfit() && OrderClosePrice()>OrderOpenPrice())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_DOWN,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_CHECK,0,OrderCloseTime(),OrderClosePrice());
}
}
}
FlagOpenPos=False;
}
Изменено пользователем SVS696
Ссылка на сообщение
Поделиться на другие сайты

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


Добрый день, возник такой вот вопрос: если у меня ордер закрывается по OrderClose, то можно нарисовать стрелку закрытия и между стрелкой открытия протянется пунктирная линия, а как тоже самое реализовать если закрытие идет по SL не виртуальному соответственно? Просто удобно, когда есть пунктир между открытием и закрытием.


Добавлено: 09-03-2017 12:16:41

Пока наваял такую вещь

if(ExistPosition(1) || ExistPosition(2))
{
FlagOpenPos=True;
}
else if(FlagOpenPos)
{
if(OrderSelect(TicketLastPos,SELECT_BY_TICKET))
{
string TypeOrder="unknown";
if(OrderType()==0) TypeOrder="buy";
else if(OrderType()==1) TypeOrder="sell";
string InfoOrder=StringConcatenate("#",OrderTicket()," ",TypeOrder," ",OrderLots()," ",Symbol()," at ",OrderOpenPrice()," close at ",OrderClosePrice());
string InfoOrder2=StringConcatenate("#",OrderTicket()," ",OrderOpenPrice()," -> ",OrderClosePrice());
if(OrderType()==0)
{
ObjectCreate(ChartID(),InfoOrder2,OBJ_TREND,0,OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice());
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_COLOR,clOpenBuy);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_RAY_RIGHT,False);
if(OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_STOP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>OrderStopLoss() && OrderClosePrice()=OrderOpenPrice())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_UP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>OrderStopLoss() && OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_DOWN,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()>=OrderTakeProfit())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_CHECK,0,OrderCloseTime(),OrderClosePrice());
}
}
else if(OrderType()==1)
{
ObjectCreate(ChartID(),InfoOrder2,OBJ_TREND,0,OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice());
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_COLOR,clOpenSell);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(ChartID(),InfoOrder2,OBJPROP_RAY_RIGHT,False);
if(OrderClosePrice()>=OrderStopLoss())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_STOP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()OrderTakeProfit() && OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_UP,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice()OrderTakeProfit() && OrderClosePrice()>OrderOpenPrice())
{
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_THUMB_DOWN,0,OrderCloseTime(),OrderClosePrice());
}
else if(OrderClosePrice() {
ObjectCreate(ChartID(),InfoOrder,OBJ_ARROW_CHECK,0,OrderCloseTime(),OrderClosePrice());
}
}
}
FlagOpenPos=False;
}


Думаю это то что тебе нужно ТЫК
КОД


//+------------------------------------------------------------------+
//| HistoryOrders.mq4 |
//| Ilnur17021992. Special for http://tradelikeapro.ru |
//| http://tradelikeapro.ru |
//+------------------------------------------------------------------+
#property copyright "Ilnur17021992. Special for http://tradelikeapro.ru"
#property link "http://tradelikeapro.ru"
#property version "1.02"
#property strict
#property indicator_chart_window

extern int MagicNumber = 0;
extern datetime HistoryOrdersFromDateTime = 0;
extern int FontSize = 10;
extern color SellColor = clrRed;
extern color BuyColor = clrBlue;
extern color ProfitColor = clrWhite;
extern bool DeleteHistoryOrders = false;

int TotalPos=-1;

//+------------------------------------------------------------------+
//| 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))
{
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType() {
if(HistoryOrdersFromDateTime {
if(OrdersHistoryTotal()!=TotalPos)
HistoryOrders();
}
}
}
} TotalPos=OrdersHistoryTotal();
}
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(), ProfitTicket, type="Sell", symbol=OrderSymbol(), comment=OrderComment(), Background;
color col=SellColor;
if(OrderType()==0) {col=BuyColor; type="Buy";}

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

for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
{
close_time=OrderCloseTime();
if(c=close_time-60)
{
Profit+=OrderProfit()+OrderCommission()+OrderSwap();
ProfitTicket=(string)OrderTicket();
CountOrders++;
}
}
}
}

if(CountOrders>1)
{
ObjectDelete("#"+Ticket+" Background");
ObjectDelete("#"+Ticket+" Profit: "+DoubleToString(Profit,2));
Ticket=ProfitTicket;
}

for(int i=2; i StringAdd(Background,"g");

ObjectCreate("#"+Ticket+" Background",OBJ_TEXT,0,c,d);
ObjectSet("#"+Ticket+" Background",OBJPROP_ANCHOR,ANCHOR_LOWER);
ObjectSetText("#"+Ticket+" Background",Background,FontSize,"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),FontSize,"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 {
DeleteHistoryOrders=true;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
HistoryOrders();
}
}
}

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

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

Уважаемые программисты!

Прошу помочь с кодом для сеточника.

Сейчас стоповые ордера (исходя из условий) могут устанавливаться в том числе на тех "местах" (то есть в диапазоне цен), где уже стоят рыночные.
Необходимо написать условие открытия сетки, при котором проверялось, нет ли в диапазоне установки сетки рыночных, и если есть, то стоповые на этих местах (то есть +/- пипсы
Код пока такой -

//+------------------------------------------------------------------+
void PutOrder1(int type,double price)
{
int r=0,err=0;
color clr=Green;
double sl=0,tp=0;

if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}

if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}

r=OrderSend(NULL,type,Lots(type),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*60,clr);
return;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Count() == 0)//если нет открытых позиций
{
acc_balance = AccountInfoDouble(ACCOUNT_BALANCE);//запомним баланс аккаунта
}
if(PutGrid)
{
DelOrder();FindOrders();//CloseAll();


for(int i=1; i {

if(BuyLots == SellLots)

{
PutOrder1(4,Bid+Delta*Point+Step*Point*i);//buystop
PutOrder1(5,Bid-Delta*Point-Step*Point*i);//sellstop
}
...

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
step-scorp, в момент установки ордера нужно в цикле перебирать все открытые ордера и проверять расстояние от цены нового ордера до цены каждого открытого. При переборе естественно нужно фильтровать ордера по интересующим параметрам. Вот небольшой пример проверки на наличие в заданном диапазоне открытых ордеров:

Спойлер


int step=300;//шаг
bool BesideHave=false;// есть/нет открытые ордера рядом

for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
//если это наш ордер
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
{
//если это не отложенный ордер
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
//если расстояние от текущей цены до этого ордера меньше или равно заданному шагу
if(MathAbs(OrderOpenPrice()-Bid) {
BesideHave=true;
break;
}
}
}
}
}
//если в диапазоне step обнаружен открытый ордер
if(BesideHave==true)
{
//.......
}
//если не обнаружен
else{
//.....
}



Вот как-то так. Я думаю мысль понятна.


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

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


step-scorp, в момент установки ордера нужно в цикле перебирать все открытые ордера и проверять расстояние от цены нового ордера до цены каждого открытого. При переборе естественно нужно фильтровать ордера по интересующим параметрам. Вот небольшой пример проверки на наличие в заданном диапазоне открытых ордеров:

Спойлер


int step=300;//шаг
bool BesideHave=false;// есть/нет открытые ордера рядом

for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
//если это наш ордер
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
{
//если это не отложенный ордер
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
//если расстояние от текущей цены до этого ордера меньше или равно заданному шагу
if(MathAbs(OrderOpenPrice()-Bid) {
BesideHave=true;
break;
}
}
}
}
}
//если в диапазоне step обнаружен открытый ордер
if(BesideHave==true)
{
//.......
}
//если не обнаружен
else{
//.....
}



Вот как-то так. Я думаю мысль понятна.


Спасибо!

А какой нужен код если ордер обнаружен?
...
//если в диапазоне step обнаружен открытый ордер
if(BesideHave==true)
{
//.......
}
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо!

А какой нужен код если ордер обнаружен?
...
//если в диапазоне step обнаружен открытый ордер
if(BesideHave==true)
{
//.......
}


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

Сейчас мы сделали проверку на предмет этого:
Цитата

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



В предыдущем примере кода мы просто проверяли есть/нет открытые позиции в заданном диапазоне от текущей цены. Можно было также запоминать тип и цену обнаруженного ордера, чтобы в дальнейшем как-то это анализировать и обрабатывать:
Спойлер


int step=300;//шаг
bool BesideHave=false;// есть/нет открытые ордера рядом
int orderType;//сюда запомним тип обнаруженного ордера
double orderPrice;//сюда запомним цену обнаруженного ордера


for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
//если это наш ордер
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
{
//если это не отложенный ордер
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
//если расстояние от текущей цены до этого ордера меньше или равно заданному шагу
if(MathAbs(OrderOpenPrice()-Bid) {
BesideHave=true;
orderType=OrderType();
orderPrice=OrderOpenPrice();

break;
}
}
}
}
}




Теперь, мы знаем что за ордер был обнаружен и его цену. Соответственно становится возможным как-то решить этот момент:
Цитата

...либо устанавливать стоповые ордера выше (если байстоп) / ниже (если селлстоп) рыночных ордеров на шаг сетки.



В общем, думать каким именно должен быть код, должны Вы сами. Я дал Вам направление для развития мысли. Изменено пользователем DreamWorks
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте! Для того что бы в настройках советника указать баланс написать вот так?
double acc_balance = 100;
Или не правильно?

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

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


подскажите как из n-последних свечей подсчитать в пунктах тела отдельно бычьих, отдельно медвежьих



Вот так:
Спойлер




//считаем тела закрытых баров
int NumBars=10;//кол-во обрабатываемых последних свечей
double Bulls=0;//сумма тел бычьих свечей
double Bears=0;//сумма тел медвежьих свечей

//в цикле перебираем последние NumBars закрытых свечей,
//считаем размеры их тел
//и складываем в переменные Bulls & Bears
for(int i=1;i {
double body=MathAbs(Open-Close);//Считаем размер тела текущей свечи
if(Open) Bulls+=body;//если свеча бычья, то складываем в переменную Bulls
else Bears+=body;//если медвежья, то складываем в переменную Bears
}
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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