Страница 2 из 3
Автор#26


а зачем подчеркивание? _Symbol и фигурная скобка перед if ?



_Symbol в обновленном языке так пишется вроде...
какая именно скобка?

Добавлено: 13-06-2016 09:11:02



а зачем подчеркивание? _Symbol и фигурная скобка перед if ?



_Symbol в обновленном языке так пишется вроде...
какая именно скобка?


Так?
void OnTick()
{
if(Close[1]>Close[2])
if(High[1]>=High[1]+dist)
{
int tiket=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask,slip,0,0,NULL,Magic,0,Blue);
}
if(High[1] {
int tiket=OrderSend(_Symbol,OP_SELLSTOP,Lot,Bid,slip,0,0,NULL,Magic,0,Red);
}
}

Изменено 13 июня, 2016 пользователем tak

#27

самая первая, я в программировании ноль, просто сейчас в справку заглянул, там при использовании IF перед первым никаких скобок не должно быть, только перед вложенными


Добавлено: 13-06-2016 09:18:25

короче я не тот у кого можно спрашивать совета по этой теме :d

Изменено 13 июня, 2016 пользователем shrike74

Автор#28


Не корректно:
- "и ниже Хай 1 свечи выставляем Селл стоп" - если свеча с длинной верхней тенью > Хпп, то будет ошибка при установке Селл-Стопа.
- "Если Бай стоп становится рыночным, то выше на Хпп выставляем Бай стоп и т. д." - "Все ордера закрываются при открытии новой свечи" - как-то это не вяжется, хотя если на Н4, то может быть...

Общая логика такая:
- на каждом тике проверяем активацию отложки по сохранённым тикетам ( выбираем ордер и проверяем тип если рыночный - значит активировалась ) , если нет далее, иначе - установка отложек вокруг цены открытия рыночного
- ждём появления новой свечи: если время 0-свечи больше предыдущего времени 0-свечи - значит новая - далее, иначе выход
- на новой свече:
- удаляем все ордера
- проверяем условие на вход по расположению баров, если нет - выход, иначе далее
- выставление отложек вокруг Хая 1 ( см.? - может закрытия 1? )

Отдельная функция, по выставлению 2-х отложек вокруг цены с дистанцией Х пп
- вычисляем цену бай-стоп отложки - выставляем, для селл-стоп - аналогично
- сохраняем тикеты отложек в глобальные переменные ( для проверки активации )
Отдельная функция удаления всех ордеров



Ордера не открываются.
void OnTick()
{
for(int i=0; i if(OrderSelect(i,SELECT_BY_POS))
if(OrderMagicNumber()==Magic)
if(OrderSymbol()==_Symbol)
if(OrderType()==OP_BUYSTOP)
bs++;
if(OrderType()==OP_SELLSTOP)
ss++;

if(Close[1]>Close[2] && High[1]>=High[1]+dist)
{
int tiket=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask,slip,0,0,NULL,Magic,0,Blue);
}
if(Close[1]>Close[2] && High[1] {
int tiket=OrderSend(_Symbol,OP_SELLSTOP,Lot,Bid,slip,0,0,NULL,Magic,0,Red);
}
}

Изменено 13 июня, 2016 пользователем tak

#29

[quote/]
Может сформулируем правила по которым будем заниматься?
Если вы не против, я предлагаю так: я пишу тз, а вы пишете его по русски, максимально близко к коду, например: если ода свеча выше другой, если открылся ордер, если... и т. д желательно все через если.
Вы пишете по русски, а я постараюсь написать это кодом.
Потом покажете, что я не правильно сделал и почему и как правильно и почему именно так правильно.
Если можно, прописывать все, пусть это будет более длинная запись, но более понятная.



Надо сначала азы учить,буквы, а вы сразу слова хотите научится писать не зная букв. Почитайте опять Ковалева, он же разжевывет каждый пример, узнать типы переменных, операторы там. У меня бывало мозги плавились от перенапряжения, но не бросил, а щас за уши не отащишь, понравилось, и логика стала будь здоров.
Автор#30


[quote/]
Может сформулируем правила по которым будем заниматься?
Если вы не против, я предлагаю так: я пишу тз, а вы пишете его по русски, максимально близко к коду, например: если ода свеча выше другой, если открылся ордер, если... и т. д желательно все через если.
Вы пишете по русски, а я постараюсь написать это кодом.
Потом покажете, что я не правильно сделал и почему и как правильно и почему именно так правильно.
Если можно, прописывать все, пусть это будет более длинная запись, но более понятная.



Надо сначала азы учить,буквы, а вы сразу слова хотите научится писать не зная букв. Почитайте опять Ковалева, он же разжевывет каждый пример, узнать типы переменных, операторы там. У меня бывало мозги плавились от перенапряжения, но не бросил, а щас за уши не отащишь, понравилось, и логика стала будь здоров.


Подскажите, что не так.
#31



Подскажите, что не так.

Все так, просто я тоже спешил и хотел за месяц научится MQL4, смешно даже.Но подходить нужно к этому основательно, серьезно, без спешки, сразу писать такие сложные алгоритмы наверно не получится.
#32

отложенные ордера пытаются открыться по текущим ценам Bid и Ask, Oll не просто так писал что нужно еще и вычислять цену открытия а не просто от балды их ставить.

ЗЫ: цитируйте сообщения правильно, глаза сломать можно пока читаешь.

#33

Будем по порядку.
Не выполнено:
1. "на каждом тике проверяем активацию отложки по сохранённым тикетам"
нет переменных с тикетами и нет кода проверки активации
2. " ждём появления новой свечи"
нет кода проверки открытия свечи
Позже будем рассматривать открытие и закрытие. Просто зарезервируйте имена функций.

Если будет такая ситуация: активировалась бай, выставили ещё бай и селл, а со старым селл что? и если в течении одной свечи цена сходит туда-сюда, то надо отслеживать все неудалённые отложки, а они могут наложиться друг на друга стопкой...

Изменено 13 июня, 2016 пользователем 0ll

Автор#34


Будем по порядку.
Не выполнено:
1. "на каждом тике проверяем активацию отложки по сохранённым тикетам"
нет переменных с тикетами и нет кода проверки активации
2. " ждём появления новой свечи"
нет кода проверки открытия свечи
Позже будем рассматривать открытие и закрытие. Просто зарезервируйте имена функций.

Если будет такая ситуация: активировалась бай, выставили ещё бай и селл, а со старым селл что? и если в течении одной свечи цена сходит туда-сюда, то надо отслеживать все неудалённые отложки, а они могут наложиться друг на друга стопкой...



Да. об этом не подумал. Имел ввиду, что на уровне на котором уже открывался ордер, больше не открывается.
Давайте просто сетку ордеров выставлять в Бай и в Селл - все ордера закрываются на открытии новой свечи.
Как сделать п1 и п2, я не знаю.
#35

Давайте не будем радикально менять ТЗ, просто добавим условие: при активации 1-й отложки 2-я удаляется.
Теперь по п. 1 и 2:
1. У Вас должны быть глобальные переменные тикет0 и тикет1. Туда будут при открытии отложек записываться полученные тикеты. и мы их будем проверять на активность:
- выделяем ордер по номеру тикета
- смотрим его тип. Например если был BUY_STOP, стал BUY - значит отложка активировалась
- 2-ю здесь можно удалить

2. Регистрируйте глобальную переменную для даты дт0.
- на каждом тике проверка: если дт0 == время открыти 0-бара - выход
иначе дт0 = время открыти 0-бара

Автор#36


Давайте не будем радикально менять ТЗ, просто добавим условие: при активации 1-й отложки 2-я удаляется.
Теперь по п. 1 и 2:
1. У Вас должны быть глобальные переменные тикет0 и тикет1. Туда будут при открытии отложек записываться полученные тикеты. и мы их будем проверять на активность:
- выделяем ордер по номеру тикета
- смотрим его тип. Например если был BUY_STOP, стал BUY - значит отложка активировалась
- 2-ю здесь можно удалить

2. Регистрируйте глобальную переменную для даты дт0.
- на каждом тике проверка: если дт0 == время открыти 0-бара - выход
иначе дт0 = время открыти 0-бара


Так сделал.
double bs=0,ss=0;
int tiket0,tiket1;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnTick()
{
for(int i=0; i if(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if(OrderMagicNumber()==Magic)
if(OrderSymbol()==_Symbol)
if(OrderType()==OP_BUYSTOP)
if(tiket0=OP_BUY)
OrderModify(tiket0,OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),0,Gold);
if(OrderType()==OP_BUY)
{
OrderDelete(tiket1);
}

if(OrderType()==OP_SELLSTOP)
if(tiket0=OP_SELL)
OrderModify(tiket1,OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),0,Gold);
if(OrderType()==OP_SELL)
{
OrderDelete(tiket0);
}



if(OrderType()==OP_SELL)
{
OrderDelete(tiket0);
}

if(Close[1]>Close[2] && High[1]>=High[1]+dist)
{
int tiket0=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask,slip,0,0,NULL,Magic,0,Blue);
}
if(Close[1]>Close[2] && High[1] {
int tiket1=OrderSend(_Symbol,OP_SELLSTOP,Lot,Bid,slip,0,0,NULL,Magic,0,Red);
}
}
#37

Примерно понятно. У Вас нет навыков написания программ. Это лечится только практикой. Ладно - продолжим.
- цикл по ордерам не нужен - ведь у Вас только 2 ордера, вот их и нужно проверить.
я уже писал: выбрать ордер по тикету, тикет в переменной tiket0,tiket1; и проверить его тип
сделайте пока только это. Посмотрите справку по функции OrderSelect

Автор#38


Примерно понятно. У Вас нет навыков написания программ. Это лечится только практикой. Ладно - продолжим.
- цикл по ордерам не нужен - ведь у Вас только 2 ордера, вот их и нужно проверить.
я уже писал: выбрать ордер по тикету, тикет в переменной tiket0,tiket1; и проверить его тип
сделайте пока только это. Посмотрите справку по функции OrderSelect



Так?
int tiket0,tiket1;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnTick()
{

if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_BUYSTOP)
if(OrderTicket()==tiket0)
if(tiket0==OP_BUY)
{
OrderModify(tiket0,OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),0,Gold);
}
if(OrderType()==OP_BUY)
{
OrderDelete(tiket1);
}
if(OrderSelect(tiket1,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_SELLSTOP)
if(OrderTicket()==tiket1)
if(tiket1=OP_SELL)
{
OrderModify(tiket1,OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),0,Gold);
}
if(OrderType()==OP_SELL)
{
OrderDelete(tiket0);
}
#39

Теплее...
- if(OrderTicket()==tiket0) - не нужно, Вы его только-что выбрали
- if(tiket0==OP_BUY) - не правильно, tiket0 - это 10-значное число, а OP_BUY = 0 ( OP_SELL = 1 )
Распишу алгоритм:
1. Выбрали ордер с тикетом tiket0
2. если его тип == OP_BUY, то вызываем функцию удаления всех отложек, затем функцию выставления новых вокруг ц. открытия.
3. Иначе выбираем ордер с тикетом tiket1
4. если его тип == OP_SELL, то вызываем функцию удаления всех отложек, затем функцию выставления новых вокруг ц. открытия.
5. Всё.

Автор#40


Теплее...
- if(OrderTicket()==tiket0) - не нужно, Вы его только-что выбрали
- if(tiket0==OP_BUY) - не правильно, tiket0 - это 10-значное число, а OP_BUY = 0 ( OP_SELL = 1 )
Распишу алгоритм:
1. Выбрали ордер с тикетом tiket0
2. если его тип == OP_BUY, то вызываем функцию удаления всех отложек, затем функцию выставления новых вокруг ц. открытия.
3. Иначе выбираем ордер с тикетом tiket1
4. если его тип == OP_SELL, то вызываем функцию удаления всех отложек, затем функцию выставления новых вокруг ц. открытия.
5. Всё.



void OnTick()
{

if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderDelete(tiket1);
}
if(Close[1]>Close[2] && High[1]>=High[1]+dist)
{
int tiket0=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask,slip,0,0,NULL,Magic,0,Blue);
}
if(Close[1]>Close[2] && High[1] {
int tiket1=OrderSend(_Symbol,OP_SELLSTOP,Lot,Bid,slip,0,0,NULL,Magic,0,Red);
}
else
tiket1;
if(OrderType()==OP_SELL)
{
OrderDelete(tiket0);
}
if(Close[1]>Close[2] && High[1]>=High[1]+dist)
{
int tiket0=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask,slip,0,0,NULL,Magic,0,Blue);
}
if(Close[1]>Close[2] && High[1] {
int tiket1=OrderSend(_Symbol,OP_SELLSTOP,Lot,Bid,slip,0,0,NULL,Magic,0,Red);
}
}
#41

Лучше.
Почитай Справочник MQL4 / Основы языка / Функции
1. вместо открытия ордеров сделай вызов функции с параметрами: цена и дистанция
2. Не выбрал ордер tiket1; запись типа: else tiket1; - ошибка
Этот участок можно сказать прошли ( осталось вызов функции )
Далее проверка закрытия бара:
1. глобальная переменная дата
2. если дата == время_0-бара - выход иначе дата = время_0-бара

Автор#42


Лучше.
Почитай Справочник MQL4 / Основы языка / Функции
1. вместо открытия ордеров сделай вызов функции с параметрами: цена и дистанция
2. Не выбрал ордер tiket1; запись типа: else tiket1; - ошибка
Этот участок можно сказать прошли ( осталось вызов функции )
Далее проверка закрытия бара:
1. глобальная переменная дата
2. если дата == время_0-бара - выход иначе дата = время_0-бара


Не получается. не знаю как сделать
void OnTick()
{

if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderDelete(tiket1);
}
if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
int vizov1(double cena,int dist);
{
OrderOpenPrice()+NormalizeDouble(dist*_Point,_Digits);
}

if(OrderSelect(tiket1,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_SELL)
{
OrderDelete(tiket0);
}
if(OrderSelect(tiket1,SELECT_BY_TICKET,MODE_TRADES))
int vizov2(double cena,int dist);
{
OrderOpenPrice()-NormalizeDouble(dist*_Point,_Digits);
}
}
#43

ещё теплее, только код самой функции надо вынести...

Краткое введение в функции:
Вы сейчас пишете код в функции void OnTick(), которая вызывается МТ на каждом тике - это обязательная функция для всех советников ( ну кроме dermitay - он её не любит :d ). Вы можете создавать свои функции для любых целей, но должны сами позаботиться о их вызове. Для чего это нужно? - чтоб не дублировать многократно один и тот же кусок кода. Выставление ордеров - это как-раз тот случай.
Т.е. у нас будет функция по выставлению отложек:

void vizov( double price, int distance ) { // Представим, что здесь код. Сейчас он не нужен. }

и будем её вызывать в коде - просто: vizov( цена , 100 );

Теперь понятно? если нет, то от Вас конкретный вопрос.
И вернёмся к коду определения закрытия бара.

Автор#44


ещё теплее, только код самой функции надо вынести...

Краткое введение в функции:
Вы сейчас пишете код в функции void OnTick(), которая вызывается МТ на каждом тике - это обязательная функция для всех советников ( ну кроме dermitay - он её не любит :d ). Вы можете создавать свои функции для любых целей, но должны сами позаботиться о их вызове. Для чего это нужно? - чтоб не дублировать многократно один и тот же кусок кода. Выставление ордеров - это как-раз тот случай.
Т.е. у нас будет функция по выставлению отложек:

void vizov( double price, int distance ) { // Представим, что здесь код. Сейчас он не нужен. }

и будем её вызывать в коде - просто: vizov( цена , 100 );

Теперь понятно? если нет, то от Вас конкретный вопрос.
И вернёмся к коду определения закрытия бара.


Я писал через void но компилятор выдавал ошибку ...
Чуть позже отвечу, если можно.
С утра за компом.

Добавлено: 14-06-2016 15:51:19


ещё теплее, только код самой функции надо вынести...

Краткое введение в функции:
Вы сейчас пишете код в функции void OnTick(), которая вызывается МТ на каждом тике - это обязательная функция для всех советников ( ну кроме dermitay - он её не любит :d ). Вы можете создавать свои функции для любых целей, но должны сами позаботиться о их вызове. Для чего это нужно? - чтоб не дублировать многократно один и тот же кусок кода. Выставление ордеров - это как-раз тот случай.
Т.е. у нас будет функция по выставлению отложек:

void vizov( double price, int distance ) { // Представим, что здесь код. Сейчас он не нужен. }

и будем её вызывать в коде - просто: vizov( цена , 100 );

Теперь понятно? если нет, то от Вас конкретный вопрос.
И вернёмся к коду определения закрытия бара.


Смысл понятен, как написать не понятно. выдает ошибку.

Добавлено: 14-06-2016 16:04:41

//+------------------------------------------------------------------+
void OnTick()
{

if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderDelete(tiket1);
}
if(OrderSelect(tiket0,SELECT_BY_TICKET,MODE_TRADES))
void vizov(double price,int dist);

}

Изменено 14 июня, 2016 пользователем tak

#45
input int distance = 100;
double tiket0, tiket1;

void OnTick()
{
if ( OrderSelect ( tiket0, SELECT_BY_TICKET ) )
{ if ( OrderType () == OP_BUY ) { if ( OrderDelete( tiket1 ) ) ; { vizov ( OrderOpenPrice(), distance ) ; return; } } }
if ( OrderSelect ( tiket1, SELECT_BY_TICKET ) )
{ if ( OrderType () == OP_SELL ) { if ( OrderDelete( tiket0 ) ) ; { vizov ( OrderOpenPrice(), distance ) ; return; } } }
}

void vizov(double price,int dist)
{
// Здесь позже напишем код
}


Есть вопросы? Напиши что Вы увидели нового в этом коде, правильно-ли расставлены скобки, соответствует-ли код ТЗ?

Изменено 15 июня, 2016 пользователем 0ll

Автор#46
input int distance=100;
double tiket0,tiket1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
if(OrderSelect(tiket0,SELECT_BY_TICKET))
{
if(OrderType()==OP_BUY)
{
if(OrderDelete(tiket1));
{
vizov(OrderOpenPrice(),distance); return;
}
}
}
if(OrderSelect(tiket1,SELECT_BY_TICKET))
{
if(OrderType()==OP_SELL)
{
if(OrderDelete(tiket0));
{
vizov ( OrderOpenPrice(), distance ); return;
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void vizov(double price,int dist)
{
// Здесь позже напишем код
}


Вроде правильно. Как то просто получилось...Пока нет вопросов.

Изменено 15 июня, 2016 пользователем tak

#47

Хорошо. Для закрепления темы функций сделайте функцию закрытия свечи, т.е. если свеча закрылась - фальсе, иначе тру.

Автор#48


Хорошо. Для закрепления темы функций сделайте функцию закрытия свечи, т.е. если свеча закрылась - фальсе, иначе тру.


void OnTick()
{
if(Close[1]=Open[0])
false;
else
true;
}
#49

1. функция ОнТик уже занята, выберите другое название.
2. Она должна возвращать Тру/фальс - значит не void
3. Как Вы собираетесь узнавать, что свеча закрылась? это if(Close[1]=Open[0]) - неподходит. Я ранее расписывал логику - посмотрите.

Автор#50


1. функция ОнТик уже занята, выберите другое название.
2. Она должна возвращать Тру/фальс - значит не void
3. Как Вы собираетесь узнавать, что свеча закрылась? это if(Close[1]=Open[0]) - неподходит. Я ранее расписывал логику - посмотрите.


Не знаю как написать "бар"
 
bool zakr();
{
if(Time[1] false;
else
true;
}
Страница 2 из 3

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

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