Ваши вопросы по языку MQL4

vadimww

Активный участник
//+------------------------------------------------------------------+
//| 3.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 string HalfTrend = "Параметры советника";
extern double Lots = 0.01;
extern int TakeProfit = 300;
extern int StopLoss = 50;
extern int slippage = 3;
extern int magic = 111;
extern string HalfTrendSov = "Параметры индикатора";
extern int Amplitude = 2;
extern bool ShowBars = true;
extern bool ShowArrows = true;
extern bool alertsOn = true;
extern bool alertsOnCurrent = false;
extern bool alertsMessage = true;
extern bool alertsSound = true;
extern bool alertsEmail = false;

double PriceHigh , PriceLow , SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(Digits == 3 || Digits == 5) // Домножение котировок для 5 - ти и 3 - х знака (Digits - знаки после запятой)
{
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 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 0 , 0); // Вывод переменных
PriceLow = iCustom(NULL, 0 , "HalfTrend" , HalfTrend ,Lots, TakeProfit, StopLoss, slippage, magic, HalfTrend, Amplitude, ShowBars, ShowArrows, alertsOn, alertsOnCurrent, alertsMessage, alertsSound, alertsEmail , 1 , 0); // Вывод переменных

if (CountSell() == 0 && Bid >= PriceHigh) // условие продажт ордера
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrent" , 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("Ошибка открытия ордера на продажу!!");
}
//+--------------------------------------------------------------------------------
if(Ask <= PriceLow && CountSell() > 0) // Закрытие ордера на продажу
{
for(int i =OrdersTotal(); 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 (CountBuy() == 0 && Ask <= PriceLow) // условие покупки ордера Ask - цена для покупки, BID для продажи
{
ticket = OrderSend(Symbol(),OP_BUY , Lots , Ask , slippage, 0 , 0 ,"HalfTrend" , magic , 0, DodgerBlue ); // Тиккет требует возвращающую переменную
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("Ошибка открытия ордера на покупку!!");
}
//+-----------------------------------------------------------------------------------------------
if(Bid >= PriceHigh && CountBuy() > 0) // Закрытие ордера на покупку
{
for(int i =OrdersTotal(); 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("Ошибка закрытия ордера на покупку!!");
}
}
}
}
//+------------------------------------------------------------------+
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);
}
//+---------------------------------------------------------------------------------------------------


Ребята подскажите почему на каждом баре происходит открытие и закрытие ордера? если можно то кусок исправления...делал вывод по стрелке
 
Последнее редактирование модератором:

vadimww

Активный участник
Нашел ошибку в ticket, два раза Bue написал..но теперь открывает ордера не по сигналам тоже..

Индюк прилагаю,должен открывать по стрелкам
 

Вложения

  • HalfTrend-1.02.mq4
    6,3 КБ · Просмотры: 24
Последнее редактирование:

Yurkov

Почетный гражданин
Советник не открывает сделки SELL по паре EURUSD на счетах с 5-ти знаком, на счетах с 4-х знаком работает в обе стороны. На паре USDJPY работает в обе стороны как на 5-ти так и на 4-х знаках. Чисто теоретически, в чем может быть проблема с EURUSD ?
 

Ugar

Гуру форума
Робот может изменить профиль?
Конечно может. Например советник может удалить себя с графика. Профиль изменится, был с советником, стал без советника. А если советнику разрешено импортировать функции из dll, он вообще всё может.
 

adamir

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

AlexeyVik

Программист mql4 mql5
Трудно написать робота, который при достижении заданной состояние счета будет переключиться на другой профиль? На втором профиле я бы поставил второй робот. (Чтобы закрыть все позиции).
А зачем? Проще написать в этом советнике, что "при достижении заданной состояние счета" закроет все позиции и просто замолчит пока его не перегрузит пользователь. Или даже может себя удалить с графика, как уже сказал Андрей.
 

Ri131211

Новичок форума
Советник не открывает сделки SELL по паре EURUSD на счетах с 5-ти знаком, на счетах с 4-х знаком работает в обе стороны. На паре USDJPY работает в обе стороны как на 5-ти так и на 4-х знаках. Чисто теоретически, в чем может быть проблема с EURUSD ?

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

adamir

Активный участник
А зачем? Проще написать в этом советнике, что "при достижении заданной состояние счета" закроет все позиции и просто замолчит пока его не перегрузит пользователь. Или даже может себя удалить с графика, как уже сказал Андрей.

Я использую подобный робот. Проблемы с него. В первом профиле у меня и другие роботы. Они открывают позиции (иногда) перед выключением роботов.
 
Последнее редактирование:

Yurkov

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

Увы, в журнале не пишется ровным счетом ничего про открытие или попытки. Тест начался, тест закончился. На 4-х знаках пишет все открытые SELL ордера, на 5-ти как будто их и не должно быть:D
//=== opening ===

bool OrderOpenBuy(int & aReturnedTicket,double aLots,double aSL,double aTP){

if(AccountFreeMarginCheck(Symbol(),OP_BUY,aLots)<=0 || GetLastError()==134){
static datetime lt1=0;
if(TimeCurrent()>lt1){
lt1=TimeCurrent()+15;
}
Print("Error open buy. Wrong lots size or not enough money");
return(false);
}

if(IsTradeContextBusy()){
static datetime lt2=0;
if(TimeCurrent()>lt2){
lt2=TimeCurrent()+15;
}
Print("Error open buy. Trade Context Busy");
return(false);
}

double tp=aTP;
double sl=aSL;

if(MWMode){
tp=0;
sl=0;
}

RefreshRates();

aReturnedTicket=OrderSend(Symbol(),OP_BUY,aLots,ND(Ask),(int)MarketInfo(Symbol(),MODE_SPREAD)*3,sl,tp,NULL,Magic,0,CLR_NONE);

if(aReturnedTicket>0){
if(MWMode){
gv.Set(ITS(aReturnedTicket)+"_mwm_sl",aSL);
gv.Set(ITS(aReturnedTicket)+"_mwm_tp",aTP);
gv.Set("MWModeDo",1);
MWModeCheckSLTP();
}
return(true);
}
else{
int tCheck=GetLastError();
Print ("Error open buy. "+ErDesc(tCheck));
return(false);
}
}

bool OrderOpenSell(int & aReturnedTicket,double aLots,double aSL,double aTP){

if(AccountFreeMarginCheck(Symbol(),OP_SELL,aLots)<=0 || GetLastError()==134){
static datetime lt1=0;
if(TimeCurrent()>lt1){
lt1=TimeCurrent()+15;
}
Print("Error open sell. Wrong lots size or not enough money");
return(false);
}

if(IsTradeContextBusy()){
static datetime lt2=0;
if(TimeCurrent()>lt2){
lt2=TimeCurrent()+15;
}
Print("Error open sell. Trade Context Busy");
return(false);
}

double tp=aTP;
double sl=aSL;

if(MWMode){
tp=0;
sl=0;
}

RefreshRates();

aReturnedTicket=OrderSend(Symbol(),OP_SELL,aLots,ND(Ask),(int)MarketInfo(Symbol(),MODE_SPREAD)*3,sl,tp,NULL,Magic,0,CLR_NONE);

if(aReturnedTicket>0){
if(MWMode){
gv.Set(ITS(aReturnedTicket)+"_mwm_sl",aSL);
gv.Set(ITS(aReturnedTicket)+"_mwm_tp",aTP);
gv.Set("MWModeDo",1);
MWModeCheckSLTP();
}
return(true);
}
else{
int tCheck=GetLastError();
Print ("Error open sell. "+ErDesc(tCheck));
return(false);
}
}

Может тут чего не так
 
Последнее редактирование:

Ugar

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

adamir

Активный участник
Проще написать что бы применял заранее подготовленный шаблон к графику. Или даже ко всем графикам.

Он должен прекратить любые роботов в первом профиле.
В том числе каких-либо неизвестных роботов *.ex4.
 
Последнее редактирование:

Ugar

Гуру форума
Он должен прекратить любые роботов в первом профиле. Также *.ex4.
При применении шаблона профиль остаётся тот же, он просто меняется.
Если сохранить шаблон без советников. То применив его к графику, всё загрузится как в шаблоне, то есть без советников.
 

adamir

Активный участник
Я знаю, шаблон. Они не могут помочь. Только помогает робот, как описано.
 

Ugar

Гуру форума
Я знаю, шаблон. Они не могут помочь. Только помогает робот, как описано.
Я имел ввиду советник или индикатор, который следит за счётом и при достижении нужного показателя применяет заданный шаблон к графику.
 

adamir

Активный участник
Я имел ввиду советник или индикатор, который следит за счётом и при достижении нужного показателя применяет заданный шаблон к графику.


Он должен работать автоматически и надежно удалить все заказы.
 

Ugar

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

adamir

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

Все заказы брокер. Какие были отправлены в другие роботов, которые по профилю. (К сожалению плохой перевод.)
 

Ugar

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