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

От xbms, 13 апреля, 2013 в Уголок Программиста

#426


Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

И историю котировок в тестер нужно подгрузить.
#427



Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

И историю котировок в тестер нужно подгрузить.




for(int i=OrdersTotal()-1; i>=0; i--)
;)

Добавлено: 18-10-2013 21:02:59



Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

И историю котировок в тестер нужно подгрузить.



Цитата

Сразу - не обязательно правильно.

:-? :-? :-?
не понял!!! :d
#428

спасибо большое, а то я все проверяю скобки, запятые,логику..
только другая проблема выявилась - открывает только один ордер , то есть при уходе цены в обратную сторону не открывает 2 ордер и т.д. - это ведь martin

#429

Уважаемый Vorchunozavr,в том то все и дело что в памяти остается виртуалка, в данный момент по коду,вот я хочу сделать так что бы виртуальные ордера удолялись из памяти вместе с отложенными ордерами вечером,если же отложники сработали,то все равно виртуалки обнулялись.Господин xbms мне посоветовал вчера написать функции типа CountTrade().Я написал не помогло пока, пишет при компиляции что функции не используются.Пока не знаю как их обнулить.если интересно посмотри код на 26 строничке test21 что б не загружать по сотню раз одно и тоже.

Автор#430


Уважаемый Vorchunozavr,в том то все и дело что в памяти остается виртуалка, в данный момент по коду,вот я хочу сделать так что бы виртуальные ордера удолялись из памяти вместе с отложенными ордерами вечером,если же отложники сработали,то все равно виртуалки обнулялись.Господин xbms мне посоветовал вчера написать функции типа CountTrade().Я написал не помогло пока, пишет при компиляции что функции не используются.Пока не знаю как их обнулить.если интересно посмотри код на 26 строничке test21 что б не загружать по сотню раз одно и тоже.



Денис, CountTrades() - это функция, которую нужно добавить в код... и которую ты должен был написать:

int CountTrades() 
{
int count = 0;
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_SELL || OrderType() == OP_BUY)
count++;
}
}
return (count);
}


разбери и прокомментируй каждую строчку этого кода!
#431


спасибо большое, а то я все проверяю скобки, запятые,логику..
только другая проблема выявилась - открывает только один ордер , то есть при уходе цены в обратную сторону не открывает 2 ордер и т.д. - это ведь martin



Для BUY должно тянуть сетку. А вот для SELL, две ошибки есть:
     else if (order_type ==OP_SELL)
{
price=FindLastPrice(OP_BUY);
if( Bid {
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot*Multiplier,2);
ticket = OrderSend(Symbol(),OP_SELL,lastlot,Bid,Slippage,0,0,"",Magic,0,Red);
if ( ticket > 0)
ModifyOrders( OP_SELL);
}
}



:-? :-? :-?
не понял!!! :d



Я просто посоветовал не спешить с неверным ответом. Ведь здесь ошибок нет:
  double avgprice = 0,
order_lots = 0;
#432

Извините Vorchunozavr!!! l-)

Цитата

Я просто посоветовал не спешить с неверным ответом. Ведь здесь ошибок нет:
Код: [Выделить]

double avgprice = 0,

order_lots = 0;



Для меня это ошибка а для Вас нет или как объясните :-?? я думал так:

double avgprice = 0;
#433
elruso

double avgprice = 0, order_lots = 0; 


Объявлены две локальные переменные типа double, сразу присвоены значения. Так, чрез запятую и пишется.
#434

А как в коде обозначить предыдущий бар?

#435


А как в коде обозначить предыдущий бар?


рискну предположить, что Open[1] это и есть предыдущий бар. А всё что точнее из вопроса не понятно.
#436
Цитата

А всё что точнее из вопроса не понятно.


Например:
if(предыдущий бар == BuyPinBar) OrderSend(.......);(текст не в коде потому что у меня высвечивается ошибка)
#437


Цитата

А всё что точнее из вопроса не понятно.


Например:
if(предыдущий бар == BuyPinBar) OrderSend(.......);(текст не в коде потому что у меня высвечивается ошибка)

а пинбар ты как определяешь? :d
#438
Цитата

а пинбар ты как определяешь


Из индикатора определения пин-баров. Их в интернете полно. Так как определить предыдущий бар, кто знает?
#439


Цитата

а пинбар ты как определяешь


Из индикатора определения пин-баров. Их в интернете полно. Так как определить предыдущий бар, кто знает?

Дык, это всем известно :)
Пишете функцию, используя Open[1], Close[1], High[1], Low[1]. В ней проверяете, процентное отношение, размеров хвостов свечи и тела (т.е., является-ли она, пинбаром вообще и пин-бай это, или пин-селл). Именно единичка в скобочках обозначает предыдущий бар, что mzk_3om6u и написал.
#440

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

#441

Дык, это всем известно :)
Пишете функцию, используя Open[1], Close[1], High[1], Low[1]. В ней проверяете, процентное отношение, размеров хвостов свечи и тела (т.е., является-ли она, пинбаром вообще и пин-бай это, или пин-селл). Именно единичка в скобочках обозначает предыдущий бар, что mzk_3om6u и написал.

Вот у меня такая функция пин-бара:
bool IsBuyPinbar(double& dayRange, int pos)
{
double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actHigherPart,actHigherPart1;
actOp=Open[pos+1];
actCl=Close[pos+1];
actHi=High[pos+1];
actLo=Low[pos+1];
preOp=Open[pos+2];
preCl=Close[pos+2];
preHi=High[pos+2];
preLo=Low[pos+2];
actRange=actHi-actLo;
preRange=preHi-preLo;
actHigherPart=actHi-actRange*0.4;
actHigherPart1=actHi-actRange*0.4;


dayRange=AveRange4(pos);
if((actCl>actHigherPart1&&actOp>actHigherPart)&&
(actRange>dayRange*0.5)&&
(actLo+actRange*0.25 {

if(Low[ArrayMinimum(Low,3,pos+3)]>Low[pos+1])
return (true);
}
return(false);

}
Для медвежьего почти так само.
Если я пишу что-то типа:

if(IsBuyPinbar(dayRange,pos)) OrderSend(.........)

То проверяя в тестере стратегий советник ордера не открываются.
Я поняла как обозначить предыдущий бар.
double dlow = Low [1]; // Минимум предыдущего бара
double dhigh = High [1]; // Максимум предыдущего бара
double dopen = Open [1]; // Открытие предыдущего бара
double dclose = Close[1]; // Закрытие предыдущего бара
double UpBar = dclose >= dopen, DownBar = dclose Теперь у меня написано:

if(UpBar || DownBar == IsBuyPinbar(dayRange,pos)) OrderSend(.........)

а ордер все равно не открывается.
#442


elruso

double avgprice = 0, order_lots = 0; 


Объявлены две локальные переменные типа double, сразу присвоены значения. Так, чрез запятую и пишется.


x_x кароткая запись ясно! будем привыкать ;)
#443

Ага, я поняла, у меня неправильная функция пин-бара. Кто может, помогите пожалуйста написать функцию определения пин-баров и чтобы она была рабочей.

#444

Народ я смотрю Вы про прайс акшен заговорили это интересно! Я вот сидел, сидел и высидел!
Код смотрит на все бары в чарте у меня на М5, и выбирает только "Пейролы"!! Замеряет их и выводит на экран потентиальные профиты и лосы для медведей и отдельно для быков! по истории на М5 получается за последний год! 12"Пейролов"! Я вывел внешние параметры где можно менять условия, то есть поставить допустим день 4-четверг и кол-во дней в месяц Как распечатать массив на экран нашёл способ через стринг, я думаю наверно другого и нету :-? Только вот сейчас пытаюсь соответственно вывести среднии значения, но не могу додуматься как сложить профиты а потом их разделить ни их общее колличество и тоже вывести на экран??? Если у когото есть идеи подтолкните плиз!!!


int init()
{
//----

string array[],str;

for(int i=0; i
if (TimeHour(Time) == 15 && TimeMinute(Time) == 30 && TimeDayOfWeek(Time) == HistoryNewsDay && TimeDay(Time)

if (Close>Open) {

int BullProfit = MathAbs(High-Open)/Point;
int BullStopLoss = MathAbs(Open-Low)/Point;

array=TimeToStr(Time) + "\n" + "Bull " + BullProfit + "pips " + BullStopLoss + " Stop " + "\n" ;
str=StringConcatenate(array,str) ;
Comment(str);



}

if (Close) {

int BearProfit = MathAbs(Open-Low)/Point;
int BearStopLoss = MathAbs(High-Open)/Point;

array=TimeToStr(Time) + "\n" + "Sell " + BearProfit + "pips " + BearStopLoss + " Stop " + "\n";
str=StringConcatenate(array,str) ;
Comment(str);


}

}


}

//----
return(0);
}

Screen_Shot_2013-10-19_at_11.57.01_AM.png

Изменено 20 октября, 2013 пользователем elruso

#445


Ага, я поняла, у меня неправильная функция пин-бара. Кто может, помогите пожалуйста написать функцию определения пин-баров и чтобы она была рабочей.



Сегодня я велосипед не напишу..., попробуем покататься на чужом :d

Есть индикатор PinBar ND, используем его и функцию iCustom (shift ставим 1 - нам нужен предыдущий бар).

bool pinbuy, pinsell;
pinbuy = iCustom(Symbol(), 0, "PinBar ND", 0, 1);
pinsell = iCustom(Symbol(), 0, "PinBar ND", 1, 1);


Дальше: if (pinbuy == true) - делаем одно, if (pinsell == true) - другое. Потом, обкладываем всё условиями...
Да, кстати, Ваше условие (if(UpBar || DownBar == IsBuyPinbar(dayRange,pos)), некорректно.

(индикатор должен быть в папке indicators)

PinBar_ND.mq436 скач.

#446
Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.

Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?

Изменено 20 октября, 2013 пользователем TANZA

#447


Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.


Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?



Наверное надо закрыть открытую сделку при появлении нового пинбара!
#448


Наверное надо закрыть открытую сделку при появлении нового пинбара!


Неа, мне нужно на каждом пин-баре входить в позицию. А кто-то вообще видел в интернете бесплатный советник пин-баров?
#449

Всем привет!


Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.


Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?


Если не заморачиваться, можно отправить советник спать, после открытия ордера. Измерять будем свечками:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
}
}


timefr - во внешние переменные. Это период графика в минутах (если H1, пишем 60, если H4 - 240).
Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;
Теперь, можно ограничить общее количество ордеров: if (CountSell() (например)

Конечно, если во время спячки перезапустить терминал или советник, может установиться ещё один ордер...
#450

Добрый день ув. Трейдеры,

Помогите пожалуста создать советник по следущим параметрам.

Индикаторы:

MA с периодом 85, low, linear weight
MA с периодом 75, low, linear weight
MA с периодом 5, close, exponential
MACD с параметрами 15, 26, 1

Сделки:
когда МА(5) пересекает сверху вниз МА(85) и МА(75) и у МАCD
1 бар закрылся ниже нуля то продаем.
Для покупок все наобарот.

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

Заранее благодарен.

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

Перейти к списку тем
Форум · 2.0.20260627.0025