Как кодировать? - страница 206

 

Использование внешних файлов *.set

Я пытался и пытался, но не могу разобраться в этом, поэтому надеюсь, что кто-то сможет увидеть дерево сквозь лес.

Я хочу запрограммировать советника, чтобы он использовал либо свои запрограммированные настройки, либо использовал внешний *.set файл.

Итак, если:

extern bool UseExternSet = true;

то он будет использовать настройки из внешнего файла set, а не запрограммированные настройки.

Знаю, что это можно сделать, но просто потерялся.

Любой пример ea будет полезен

Бернард

 

Проблема с компилятором или проблема с кодом?

extern int ma1period=5;

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 не определена". Что мне делать? Насколько я могу судить, переменная была инициализирована и ей было присвоено значение.

Это проблема компилятора или кода?

Файлы:
capture2_1.png  12 kb
 

[CODE]

double CMA (int tf, int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift);

return(MA);

}

 
username1:
[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, что тикер недействителен.

Может кто-нибудь проверить это и мою программу во вложении и помочь, пожалуйста?

Большое спасибо

Файлы:
rsiproba.mq4  6 kb
 

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;