Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасибо, Ральф, я попробовал это, но потом он выдал еще один список ошибок - сказал, что все переменные в включающем файле не определены - но они определены.
Я попробую еще раз на выходных, это меня сейчас немного расстраивает.
@faqcya - я подозреваю, что вы правы насчет помещения его в скрипт, но я не знаю, как еще обращаться к нему, если у меня нет советника оболочки, в которую его можно поместить.
Может быть, я посмотрю на шаблоны и посмотрю, смогу ли я вызвать его из них или даже лучше, возможно, превратить его в советника, мне нужен только он сам по себе, а не для того, чтобы делать что-то еще.
Спасибо за помощь,
Кевин
@pgtips: измените вторую строку, чтобы она была только
Пытаюсь научиться программированию
Прежде всего, я прочитал весь курс Corder's Guru и нашел его очень интересным. Я пришел к выводу, что единственный разумный способ опробовать стратегию - это написать программу, чтобы убедиться в ее полной точности. К сожалению, я полный новичок, когда дело доходит до этого.
Я пытался написать базовую программу и даже не могу заставить ее работать. По крайней мере, я больше не получаю никаких ошибок, но она не принимает никаких заказов. Я настойчив и буду продолжать попытки, но был бы признателен за помощь всем, кто видит мою ошибку.
Все, что я пытаюсь сделать на данный момент, это отследить самую низкую цену (CurrentLow), а затем, когда она отступит на определенную величину (Ret1), разместить ордер на продажу с TP от нижней точки.
Пожалуйста, не смейтесь, но вот что я написал на данный момент:
//---- входные параметры
extern double TP1=75.0;
extern double Ret1=75.0;
extern double SL1=150.0;
extern double Lots=0.1;
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция запуска эксперта |
//+------------------------------------------------------------------+
int start()
{
int ticket=0;
if(Bars<100)
{
Print("баров меньше 100");
return(0);
}
double CurrentLow,CurrentHigh;
if(Bid < CurrentLow)
{
CurrentLow = Bid;
if(Bid > CurrentHigh)
{
CurrentHigh = Bid;
if(CurrentHigh >= CurrentLow+(Point*Ret1))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);
return (0);
}
return (0);
}
return (0);
}
}
Прежде всего, я прочитал весь курс Corder's Guru и нашел его очень интересным. Я пришел к выводу, что единственный разумный способ опробовать стратегию - это написать программу, чтобы убедиться в ее полной точности. К сожалению, я полный новичок, когда дело доходит до этого.
Я пытался написать базовую программу и не могу заставить ее работать. По крайней мере, я больше не получаю никаких ошибок, но она не принимает никаких заказов. Я настойчив и буду продолжать попытки, но был бы признателен за помощь всем, кто видит мою ошибку.
Все, что я пытаюсь сделать на данный момент, это отследить самую низкую цену (CurrentLow), а затем, когда она отступит на определенную величину (Ret1), разместить ордер на продажу с TP от нижней точки.
Пожалуйста, не смейтесь, но вот что я написал на данный момент:
//---- входные параметры
extern double TP1=75.0;
extern double Ret1=75.0;
extern double SL1=150.0;
extern double Lots=0.1;
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция запуска эксперта |
//+------------------------------------------------------------------+
int start()
{
int ticket=0;
if(Bars<100)
{
Print("баров меньше 100");
return(0);
}
double CurrentLow,CurrentHigh;
if(Bid < CurrentLow)
{
CurrentLow = Bid;
if(Bid > CurrentHigh)
{
CurrentHigh = Bid;
if(CurrentHigh >= CurrentLow+(Point*Ret1))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);
return (0);
}
return (0);
}
return (0);
}
}Кажется неправильным проверять, если Bid > CurrentHigh внутри истинного условия, что Bid < CurrentLow; я считаю, что вы должны иметь независимые тесты, подобные этому:
double CurrentLow,CurrentHigh;
int start()
{
if(Bid < CurrentLow) CurrentLow = Bid;
if(Bid > CurrentHigh) CurrentHigh = Bid;
if(Bid >= CurrentLow+(Point*Ret1))
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point),"Albatross_v1",757575,0,Green);
return(0);
}Теперь три замечания:
- Вы должны объявить CurrentHigh и CurrentLow на глобальном уровне, то есть вне любой функции (а start() - это функция), иначе эти переменные будут инициализироваться в 0 при каждом вызове функции.
- Вам не нужна CurrentHigh, так как она не используется.
- Вы должны реализовать некоторую логику для сброса/обновления значения CurrentLow, и, возможно, для ограничения открытия ордеров на каждом тике выше CurrentLow+(Point*Ret1)).
Здравствуйте, Мишель,
Большое спасибо за ваш быстрый ответ и помощь.
Я удалил CurrentHigh и теперь понимаю намного лучше. Я также определил CurrentLow в верхней части программы, и теперь она действительно выставляет ордера.
Я также добавил второй ордер на основе более крупного отката, и это, кажется, работает. Теперь мне нужно понять, как остановить его от создания нового ордера на каждом тике, но я буду работать над этим самостоятельно, так как так я лучше научусь.
Я уверен, что вернусь сюда с новыми вопросами.
Еще раз спасибо.
Putz
Привет, Мишель,
Большое спасибо за быстрый ответ и помощь.
Я удалил CurrentHigh и теперь понимаю намного лучше. Я также определил CurrentLow в верхней части программы, и теперь она действительно размещает ордера.
Я также добавил второй ордер на основе более крупного отката, и это, кажется, работает. Теперь мне нужно понять, как остановить его от создания нового ордера на каждом тике, но я буду работать над этим самостоятельно, так как так я лучше научусь.
Я уверен, что вернусь сюда с новыми вопросами.
Еще раз спасибо.
PutzНе забудьте инициализировать CurrentLow большим значением (например, 1000); если его инициализировать 0, у вас никогда не будет Bid < 0.
Какой язык программирования мне изучать?
Здравствуйте, друзья,
У меня много личных сообщений с просьбой помочь с некоторыми фрагментами кода.
Здесь вы можете задавать свои вопросы, связанные с MQL4, и я постараюсь ответить на них.Уважаемые кодерсгуру,
Если я хочу научиться писать коды на MQL4, какой язык программирования мне изучать? Visual basic или C++? Спасибо за ответ.
Помогите, пожалуйста
Здравствуйте,
Я снова обращаюсь за помощью. Я читал и смотрел на многие другие советники, чтобы попытаться разобраться в этом, но я все еще не могу заставить его работать правильно.
Я пытаюсь сделать два ордера.
1) Продать 0.1 лот, как только цена отступит на Ret1 (75 пунктов) с TP1 (75) и SL1 (150).
2) Продать 0.2 лота, как только цена отступит от Ret2 (150 пунктов) с TP1 (75) и SL1 (75).
В долгосрочной перспективе я хочу, чтобы ордер на покупку, как описано выше, выставлялся в зависимости от направления тренда. Я еще не определил, какой индикатор я буду использовать для определения тренда, но в какой-то момент я до этого доберусь.
Ниже приведено то, что я имею на данный момент. Кажется, что первый ордер размещается правильно, но второй никогда не срабатывает. Любая помощь будет высоко оценена.
extern string Expert_Name = "Albatross v1";
extern int MagicNumber = 757575;
extern int Slippage = 3.0;
//---- входные параметры
extern double TP1=75.0;
extern double TP2=75.0;
extern double Ret1=75.0;
extern double Ret2=150.0;
extern double SL1=150.0;
extern double SL2=75.0;
extern double Lots=0.1;
double CurrentLow=1000;
//double CurrentHigh=0;
int OpenOrders=0,cnt=0;
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
//int init()
// {
//---- индикаторы
//----
// return(0);
// }
//+------------------------------------------------------------------+
//| Пользовательская функция деинициализации индикатора | |
//+------------------------------------------------------------------+
// int deinit()
// {
//---- TODO: добавьте свой код сюда
//----
// return(0);
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора |
//+------------------------------------------------------------------+
// int start()
// {
//---- TODO: добавьте свой код сюда
//----
// return(0);
// }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Проверка контроля открытого положения |
//+------------------------------------------------------------------+
int CheckOpenTrades()
{
int cnt;
int NumTrades; // Количество сделок на покупку и продажу по данному символу
NumTrades = 0;
for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
if ( OrderSymbol() != Symbol()) continue;
if ( OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == OP_BUY ) NumTrades++;
if(OrderType() == OP_SELL ) NumTrades++;
}
return (NumTrades);
}
//+------------------------------------------------------------------+
//| функция запуска эксперта |
//+------------------------------------------------------------------+
int start()
{
int cnt, ticket, total;
двойной TP;
if(Bars<100)
{
Print("баров меньше 100");
return(0);
}
total = CheckOpenTrades();
if(total < 1)
{
if(Bid < CurrentLow) CurrentLow = Bid;
if(Bid >= CurrentLow+(Point*Ret1))
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",MagicNumber,0,Green);
}
if(total < 2)
{
if(Bid >= CurrentLow+(Point*Ret2))
OrderSend(Symbol(),OP_SELL,Lots*2,Bid+(Point*Ret2),3,Bid+(SL2*Point),Bid-(TP2*Point), "Albatross_v1",MagicNumber,0,Green);
return(0);
}
}
//+------------------------------------------------------------------+
Извините, что беспокою вас этим вопросом
Как создать объект, который заполняется цветом?
Дэйв
<<<
Привет всем, я кодер и уже давно кодирую на C++, но мои знания FX и MQL4 очень базовые. Я изучаю советник, который кто-то написал, и пытаюсь понять код...
Не могли бы вы объяснить мне простым английским языком, что такое параметр SHIFT в методе iMA?
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
согласно справке MT4, это "Индекс значения, взятого из буфера индикатора (сдвиг относительно текущего бара на заданное количество периодов назад)." - Что такое буфер индикатора?
Он также делает следующее...
int RealTime = 0;
if( UseCompletedBars )
{
if(timeprev==Time[0]){return(0);} timeprev = Time[0];
RealTime = 1;
}
double MA11 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,0+RealTime);
double MA12 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,1+RealTime);
double MA21 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,0+RealTime);
double MA22 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,1+RealTime);
if( MA11 > MA21 && MA12 < MA22 ) { EnterLong = True; }
if( MA11 MA22 ) { EnterShort = True; }Что это вернет? Поскольку я не знаю сдвиг, я думаю, поэтому я не могу получить его ...
Ваш ответ будет высоко оценен.
пожалуйста, помогите.