Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Использование внешних файлов *.set
Я пытался и пытался, но не могу разобраться в этом, поэтому надеюсь, что кто-то сможет увидеть дерево сквозь лес.
Я хочу запрограммировать советника, чтобы он использовал либо свои запрограммированные настройки, либо использовал внешний *.set файл.
Итак, если:
extern bool UseExternSet = true;
то он будет использовать настройки из внешнего файла set, а не запрограммированные настройки.
Знаю, что это можно сделать, но просто потерялся.
Любой пример ea будет полезен
Бернард
Проблема с компилятором или проблема с кодом?
extern int ma1method=1;
extern int ma1tf=0;
extern int ma2period=5;
extern int ma2method=1;
extern int ma2tf=10080;
extern double lots=1;
int init(){}
int deinit(){}
double CMA (int tf,int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift)
return(MA)
}
int start()
{
int BarsCount=0;
if (Bars> BarsCount)
{
BarsCount=Bars;
double ma1.1=CMA(ma1tf,ma1period,1,ma1method);
double ma1.2=CMA(ma1tf,ma1period,2,ma1method);
double ma2.1=CMA(ma2tf,ma2period,1,ma2method);
double ma2.2=CMA(ma2tf,ma2period,2,ma2method);
bool ma1upsignal =ma1.2<ma1.1;
bool ma1downsignal =ma1.2>ma1.1;
bool ma2upsignal =ma2.2<ma2.1;
bool ma2downsignal =ma2.2>ma2.1;
if (ma1upsignal&&ma2upsignal)
{
OrderSend(Symbol(),OP_BUY,lots,Ask,3,NULL,NULL,NULL,NULL,0,Green);
}
if (ma1downsignal&&ma2downsignal)
{
OrderSend(Symbol(),OP_SELL,lots,Bid,3,NULL,NULL,NULL,NULL,0,Green);
}
if ((ma1upsignal&&ma2downsignal)||(ma1downsignal&&ma2upsignal))
{
int total=OrdersTotal(); //Script to close all open orders.
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
switch(type)
{
//Close opened long positions
case OP_BUY : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positions
case OP_SELL : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
}
}
}
}
Вот кусок кода, над которым я работаю. Компилятор говорит, что "переменная BarsCount не определена". Что мне делать? Насколько я могу судить, переменная была инициализирована и ей было присвоено значение.
Это проблема компилятора или кода?
[CODE]
double CMA (int tf, int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift);
return(MA);
}
[CODE]
double CMA (int tf, int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift);
return(MA);
}Мишель,
Спасибо. Это решило проблему :-)
Подсчет последовательных баров
У кого-нибудь есть код для подсчета последовательных баров покупки/продажи подряд? Я хочу подсчитать, сколько раз на графике (введите количество баров для проверки) есть 1 бар на продажу подряд, 32 бара на продажу подряд, 3 бара на продажу подряд, 4 бара на продажу подряд (то же самое с покупкой) и т.д.
Я знаю, что нужно сделать цикл, но не могу понять как.
Результаты могут идти в Comment().
спасибо.
Почему моя прога не работает?
Написал простую программу.
Она должна вводить только один ордер за раз, и выходить с тейк профитом или стоп лоссом.
Она настроена на M30 на GBPUSD.
Т.е.: некоторые константы sed в проге найдены "на глаз". Это не должно сильно повлиять на работу программы... она также не работает с другими константами. (По крайней мере, при тестировании в тестере стратегий, установленном на быстрое или среднее значение: не "тик за тиком". (слишком медленно...)
В любом случае, прога при тестировании не вводит ордер И НИКОГДА! не проверяет в направлении "вверх". (Это, через "print"/trace)
(предполагается, что она должна проверять: вход в покупку или вход в продажу).
Случайная логика: проверьте 2 последовательных бара. Если бар 1 имеет оба: более высокий максимум и более высокий минимум, программа считает, что следующий бар будет восходящим.
(Симметрично - вниз).
Тейк-профит и стоп-лосс устанавливаются соответствующим образом.
Прога также не работала, когда утверждения "if" были вложенными.....
Спасибо, что посмотрели на это.
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| функция запуска эксперта |
//+------------------------------------------------------------------+
int start()
{
//----
bool TrendUp1;double TakeProfitUp;double EE = .00500;
bool OrdTot_OK;double lot;double slip;
double SL_Trailing_Up;bool High2Up;bool Low2Up;
int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;
bool TrendDown; double SL_Trailing_Down;double TakeProfitDown;
bool High2down; bool Low2down;
int ABC = OrdersTotal();
double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];//41
double C = High[2]; double D = Low[1];bool BigDown;
//------------------------------------ начало ордера
if (ABC == 0)//нет ордеров на выход true
OrdTot_OK = true;
if (ABC == 0)// no orders out is true
Print ("при последовательности ордеров вниз, ни один ордер не вышел");
if ((C-D) > Size1)//высота из 2 меньше минимума из 1 > .0063
BigDown = true;
if ((C-D) > Size1)//high of 2 less low of 1 > .0063
Print ("на последовательности ордеров вниз, найден большой прорыв вниз");
if (High[1]< High[2])
High2down=true;
if (High[1]< High[2])
Print ("на последовательности ордеров вниз, последовательные бары имеют снижающиеся максимумы");
if(Low[1]< Low[2])
Low2down=true;
if(Low[1]< Low[2])
Print ("в последовательности ордеров вниз, последовательные бары имеют убывающие минимумы");
if (High2down && Low2down)
TrendDown=true;
if (High2down && Low2down)
Print ("в последовательности ордеров на понижение установлен флаг TrendDown");
if (TrendDown)
SL_Trailing_Down = High[1];
if (TrendDown)
Print ("в последовательности ордеров на понижение установлен стоп_лосс");
if (TrendDown)
TakeProfitDown = Bid - (.005);
if (TrendDown)
Print ("в последовательности ордеров на понижение получен тейкпрофит", TakeProfitDown);
if (TrendDown && BigDown)
DownAndBig = true;
if (DownAndBig && OrdTot_OK)
ticketdown = OrderSend(Symbol(),OP_SELL,lot,Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);
if (DownAndBig && OrdTot_OK)
Print ("на последовательности ордеров вниз, пытались ввести тикет", ticketdown);
if (ticketdown < 0)
Print("OrderSend_Down failed with error #",GetLastError());
return(0);
//----------------------------------------------down order done
//---------------------------------------------------up order start
if (ABC == 0)
OrdTot_OK = true;
if (ABC == 0)
Print ("на восходящей последовательности не было ни одного ордера");
if ((A - B) > Size1)
BigUp = true;
if ((A - B) > Size1)
Print ("на восходящей последовательности тест размера для двух баров прошел нормально");
if (High[1] > High[2])
High2Up = true;//44
if (High[1] > High[2])
Print ("на восходящей последовательности тест на повышение максимумов был в порядке");
if(Low[1] > Low[2])
Low2Up=true;
if(Low[1] > Low[2])
Print ("на восходящей последовательности тест на растущие минимумы был в порядке");
if (High2Up && Low2Up)
TrendUp1=true;
if (High2Up && Low2Up)
Print ("на восходящей последовательности был установлен флаг для восходящей последовательности");
if (TrendUp1)
SL_Trailing_Up = Low[1] ;
if (TrendUp1)
Print ("на восходящей последовательности установил стоплосс");
if (TrendUp1)
TakeProfitUp = Ask + (.005);
if (TrendUp1)
Print ("на восходящей последовательности установлен тейкпрофит", TakeProfitUp);
if (TrendUp1 && BigUp)
UpAndBig = true;
if (UpAndBig && OrdTot_OK)
ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);
if (UpAndBig && OrdTot_OK)
Print ("на восходящей последовательности попытался отправить ордер", ticketup);
if (ticketup < 0)
Print("OrderSend_Up failed with error #",GetLastError());
return(0);
//-------------------------------------------------up order done
//----
return(0);//не уверен насчет этой строки
//+------------------------------------------------------------------+
//----
return(0);
}
//+------------
Минимальные бары до/после торговли
Привет,
Здравствуйте, я новичок в MT4... Не мог бы кто-нибудь подсказать мне, как я могу установить ограничение в советнике, которое требует минимум "x" баров для открытия новой позиции или закрытия предыдущей?
(без использования команды sleep).
С уважением.
помощь в кодировании mql
if (iMA(NULL, 0, 24, 0, MODE_LWMA, PRICE_WEIGHTED, 1) > iMA(NULL, 0, 120, 1, MODE_LWMA, PRICE_WEIGHTED, 1)) gi_268 = 2;
---------------------------------------------------------------
что это значит?
Используется 2 LWMA ?
LWMA период =24 сдвиг =0 по взвешенной цене (hcll4) пересечение LWMA период 120 сдвиг =1 по взвешенной цене (hcll4) тогда покупка или продажа ??
Проблема с закрытием позиции
Здравствуйте,
Я только что начал работать с моим новым советником и открытие позиций проходит нормально, я установил tp и sl. Советник открывает и закрывает по 1 позиции и никогда не бывает более 1 ордера. Но я хотел бы закрыть позицию, если некоторые индикаторы предупреждают меня до того, как sl или tp ограничатся.
Если я попробую сделать что-то подобное:
for (int i=1; i<=OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, 2)) {
if (OrderSymbol()==Symbol()) {
Ans=OrderClose(OrderTicket(),alLots,Bid,2);// Order closing
}
}
}[/CODE]
Nothing happened. Doesn't find any opened positions and I know there is 1.
If I try something like this:
for (int i=1; i<=OrdersTotal(); i++) {
CloseOrder(OrderValue(i,VAL_TICKET),OrderValue(i,VAL_LOTS),Bid,3);
}Compiler report error message that VAL_TICKER and VAL_LOTS are not defined and in examples I found they are nowhere declared.
If I try direcly by number to close:
[CODE]
Ans=OrderClose(0,alLots,Bid,2);// Order closingя получаю сообщение об ошибке 4107 или 4105, что тикер недействителен.
Может кто-нибудь проверить это и мою программу во вложении и помочь, пожалуйста?
Большое спасибо
iHighest iLowest Разъяснение
Предполагается 3 бара: Бар [2], Бар [1] и Бар [0] (текущий).
Является ли следующая функция "stop_low()" правильной для нахождения самого низкого минимума баров [2] и [3]?
double stop_low = iLowest(Symbol(),0,1,2,1);
------------------------------------------------------------
Ссылка:
int iLowest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
Возвращает сдвиг наименьшего значения за определенное количество периодов в зависимости от типа.
Параметры:
symbol - Символ, данные которого должны быть использованы для расчета индикатора. NULL означает текущий символ.
timeframe - Таймфрейм. Это может быть любое из значений перечисления Timeframe. 0 означает текущий таймфрейм графика.
type - Идентификатор массива Series. Это может быть любое из значений перечисления Series array identifier.
count - Количество периодов (в направлении от стартового бара к последнему), на которых производится расчет.
start - Сдвиг, показывающий бар, относительно текущего бара, с которого должны быть взяты данные.
Пример:
// вычисление наименьшего значения на 10 консеквентных барах в диапазоне
// от 10-го до 19-го индекса включительно на текущем графике
double val=Low;