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

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

#3551
vitek01 делай так: int R = (int) ( ( High[ 0 ] - Low[ 0 ] ) / _Point );


Ух ты, спасибо 0ll, полазил по гугле по данной проблеме, одно фуфло, а тут 1 строчкой проблемку решили!

чтобы привести к понятным пунктам для 5 знака зделал так
int R = (int) ( ( ( High[ 0 ] - Low[ 0 ] ) / _Point ) ) / 10;
конечно огругляет не в мою пользу, откидывая лишнее, но ясно и понятно.

Изменено 12 мая, 2016 пользователем vitek01

#3552

функция удаления ордеров для xNorDx
комментарии, я думаю, излишни.

Спойлер

// sd == 0 - бай/байлимит/байстоп
// sd == 1 - селл/селллимит/селлстоп
// sd == -1 - значение по умолчанию. удаляет и закрывает ВСЁ
void CloseAll(int sd = -1)
{
int ord=OrdersTotal();
double pr= 0;
for(int i=ord-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=magic) continue;
if((sd==0 && (OrderType()==2 || OrderType()==4)) || (sd==1 && (OrderType()==3 || OrderType()==5))||(sd==-1&&OrderType()>1))
{
int k=10;
while(k>0)
{
if(OrderDelete(OrderTicket())) break;
Sleep(50);
k--;
}
continue;
}
if(OrderType()==sd || (sd==-1&& OrderType() {
int k=10;
while(k>10)
{
RefreshRates();
if(OrderType()==0) pr=Bid;
if(OrderType()==1) pr=Ask;
if(OrderClose(OrderTicket(),OrderLots(),pr,30)) break;
k--;
Sleep(50);
}
}
}
}

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

#3553

Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?

#3554


Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?


потомучто скорее всего в индюке используется настройка сдвига GMT(), из-за чего в коде используется не простое обращение к предыдущему дню, наподобие iHigh(Symbol(),PERIOD_D1,1), а идет подсчет баров, и именно из-за этого подсчета и возникают "сдвиги", то есть конец дня на разных ТФ из-за ограничения в количестве баров попадает на разные временные промежутки, и соответственно на разные цены хай/лоу.
#3555



Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?


потомучто скорее всего в индюке используется настройка сдвига GMT(), из-за чего в коде используется не простое обращение к предыдущему дню, наподобие iHigh(Symbol(),PERIOD_D1,1), а идет подсчет баров, и именно из-за этого подсчета и возникают "сдвиги", то есть конец дня на разных ТФ из-за ограничения в количестве баров попадает на разные временные промежутки, и соответственно на разные цены хай/лоу.

Так и в советнике сдвиг по GMT
#3556


функция удаления ордеров для xNorDx
комментарии, я думаю, излишни.

Прости, но хочу напомнить о таком способе сортировки ордеров, может и не в тему... просто такие конструкции тоску наводят:


if((sd==0 && (OrderType()==2 || OrderType()==4)) || (sd==1 && (OrderType()==3 || OrderType()==5))||(sd==-1&&OrderType()>1))



ПС: прошу прощения - ошибочка!
Код с битовыми флагами пробовал наспех. нужны уникальные коды флагов ( 1-бит на флаг):
enum ORD_TYPE { buy = 1, sell = 2, buy_lim = 4, sell_lim = 8, buy_stop = 16, sell_stop= 32 };
т.е. например sell_lim = MathPow(2,OP_SELLLIMIT) = 2 ^ 3 = 8;
или через массив: int arrType[] = {1,2,4,8,16,32}; // массив флагов
чуть поменяется код и вызов:

void orderDelete( int flag_type )
{
// здесь цикл по ордерам
if ( ( flag_type & MathPow(2,OrderType( ) ) ) > 0 ) .... ; // здесь определяем, что ордер задан
if ( ( flag_type & arrType[ OrderType( ) ] ) > 0 ) .... ; // то-же только через массив
while(k>0) {... // цикл попыток закрытия
if ( OrderType() > 1 ) // здесь выбираем способ Delete || Close
}

вызов функции: orderDelete( sell | sell_lim | sell_stop ); // в вызове используем не стандартные константы, а свои
orderDelete( arrType[OP_SELL] | arrType[OP_SELLLIMIT] | arrType[OP_SELLSTOP] ); // через массив

код писал для образовательных целей - многие вообще не знают как применять побитовые операции...

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

#3557

Добрый день. Имеется функция подсчета количества убыточных ордеров подряд (в дальнейшем использую для открытия и модификации позиций).

Возможно ли сделать так, чтобы счетчик обнулялся на следующий день? Тоесть в расчет брались именно ордера за сегодняшний день (либо каким нибудь другим образом).

Спойлер

int consecutive_loss;
{
int counter = 0;
datetime opentime[];
double profit[];
for(int index=0;index {
if(!OrderSelect(index,SELECT_BY_POS,MODE_HISTORY) )
continue;
else
if(OrderMagicNumber() == MAGIC && OrderSymbol() == Symbol() && OrderType()==OP_BUY||
OrderMagicNumber() == MAGIC && OrderSymbol() == Symbol() && OrderType()==OP_SELL)
{
counter++ ;
ArrayResize( opentime, counter);
ArrayResize( profit, counter);
opentime[counter -1]=OrderOpenTime();
profit[counter -1]=OrderProfit();
}
}
int orderarray [];
ArrayResize( orderarray, counter);
datetime copyopentime[];
ArrayResize( copyopentime, counter);
ArrayCopy(copyopentime,opentime);


for(int x=counter-1;x>=0;x--)
{
int latest = ArrayMaximum(copyopentime,WHOLE_ARRAY,0) ;
orderarray[ x ] =latest;
copyopentime[latest] = 0;
}

for(int x=counter-1;x>=0;x--)
{
int pos = orderarray[ x ];
if(profit[pos] consecutive_loss++;
else
break;
//Print(" Profit = ",profit[pos]) ;
}

}

#3558
xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.
#3559


xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.



Никак не могу сообразить как это реализовать кодом. Как то можно сделать выборку из истории именно за текущий день?
#3560

Конечно можно, вообще любой каприз реализуем. Используйте функции Day(); и TimeDay( OrderCloseTime() )
если равны - считаем, нет - пропускаем.

#3561



xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.



Никак не могу сообразить как это реализовать кодом. Как то можно сделать выборку из истории именно за текущий день?


Можно так, для закрытых сегодня ордеров:

Спойлер

datetime dt=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE));
int i,k=OrdersHistoryTotal();

for(i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(dt {
// Здесь уже ордера только за сегодня.
}
}
}

#3562

Помогите пожалуйста кто может.
Написал советник но он не выставляет на тестере вторые отложные ордера как надо один раз. пробовал и OP_BUYLIMIT и OP+BUYSTOP селы то же самое, но когда решает выставлять гад выставляет кучу!
по стратегии надо выставить в одну сторону один ордер затем в эту же сторону но на шаг лося.

test2+sl.mq411 скач.

#3563

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

Не могу нигде найти код, который нужно добавить в индикатор, чтобы отображались вкладки выбора цены и уровни в индикаторе.


Screenshot-1604.jpg

#3564

Скорректировал комплексный советник (из 21 индикатора) , убрав ненужные мне индикаторы и добавив свой - SuperSignalChannel (сократил название до SSCh для простоты). В результате "родные" индикаторы работают, а при подключении SSCh советник не фурычит. После компиляции советник ошибок не выдает, но при тесте в тестере результата нет, хотя ошибок тоже нет, да и в режиме визуализации показывает SSCh. В чем может быть косяк?

SSCh.mq49 скач.
MyComplexExpert2.mq410 скач.

#3565

Здравствуйте. При написании советника возникла проблема, которую решить не знаю как. В советнике используются две сетки ордеров по sell и buy, отличающиеся суммарной величиной лота. В обоих сериях необходимо установить одинаковую рассчитанную величину ТР. Решение проблемы свел к модельной более простой задаче. Простейший советник открывает ордер sell и модифицирует его 2 способами. В первом случае ТР выставляется выше текущей цены и модификация почему-то не проходит-дает ошибку 130, во втором ниже текущей цены - здесь модифицируется нормально. Ведь ТР в ручном ордере я могу выставить и выше и ниже текущей цены, лишь бы не попасть в область стоп-левела, почему при автоматической модификации это не так? Помогите, кто знает. Советник модельной задачи во вложении

проверка_модификации-тики.mq49 скач.

#3566


Простейший советник открывает ордер sell и модифицирует его 2 способами. В первом случае ТР выставляется выше текущей цены и модификация почему-то не проходит-дает ошибку 130, во втором ниже текущей цены - здесь модифицируется нормально. Ведь ТР в ручном ордере я могу выставить и выше и ниже текущей цены, лишь бы не попасть в область стоп-левела, почему при автоматической модификации это не так? Помогите, кто знает. Советник модельной задачи во вложении


На ордер селл невозможно поставить ТП выше текущей цены. Откройте в метатрейдере (на демо счете) ордер селл и попробуйте модифицировать как вы пишете. Ничего не выйдет.
#3567

Спасибо, называется бился со стенкой, я сегодня сам попробовал и убедился в этом,хотел отписаться, но меня опередили, значит к сериям надо применять SL и ТР.
С уважением Владимир

#3568

Здравствуйте! Учусь программированию. Изучил урок по трейлингстопу. Написал первый советник ( блин комом).Работает не правильно. Помогите разобратся.
При условиях на покупку, открывает продажи.

PolyVelocity.mq46 скач.
Bablokosyaka.mq44 скач.
Chandelierstops.mq43 скач.

Изменено 18 мая, 2016 пользователем chww

#3569

Помогите разобраться.
Начал изучать программирование в MQL4. Скачал видео урок - смотрю, повторяю.
И вот возникла проблема. Написал код (как в видео):
int ticket;
ticket = OrderSend("EURUSD", OP_BUY, Ask, 0.1, 3, 0, 0, "", 111, 0, Blue);
if(ticket {
Print("Ошибка открытия ордера на покупку!");
}
else
{
Print("Ордер на покупку успешно открыт!");
}
При компиляции ошибок нет. Но когда начинаю прогон, то в журнале вылезает ошибка "OrderSend error 138", и ордера не открываются. Как сказано в справке - это означает, что запрашиваемые цены устарели. И что с этим делать?


Добавлено: 18-05-2016 14:38:35


Помогите разобраться.
Начал изучать программирование в MQL4. Скачал видео урок - смотрю, повторяю.
И вот возникла проблема. Написал код (как в видео):
int ticket;
ticket = OrderSend("EURUSD", OP_BUY, Ask, 0.1, 3, 0, 0, "", 111, 0, Blue);
if(ticket {
Print("Ошибка открытия ордера на покупку!");
}
else
{
Print("Ордер на покупку успешно открыт!");
}
При компиляции ошибок нет. Но когда начинаю прогон, то в журнале вылезает ошибка "OrderSend error 138", и ордера не открываются. Как сказано в справке - это означает, что запрашиваемые цены устарели. И что с этим делать?



Нашёл косяк. "Ask" и "0.1" надо было поменять местами.

Изменено 18 мая, 2016 пользователем Svarog_AZh

#3570

Здравствуйте, написал свой первый советник, но никак не могу в нем поставить запрет на торговлю в понедельник.

Цитата

int DayOfWeek;
void OnTick()
{
if (DayOfWeek()==1) return; //Если понедельник, то в начало.
..... //Действие, если другие дни.
}


Пишет: 'DayOfWeek' - ambiguous call to overloaded function with the same parameters
Что я не так делаю?
#3571

Убери int DayOfWeek; над void OnTick()

#3572

Тестер стратегий видит только 1000 баров историй, а мне нужно больше, чтобы уровни были коректными, если данных мало, то уровни кривые получаются. Как можно увеличить количество баров в тестере стратегий?

#3573
vitek01 Попробуйте в МТ - Сервис - Настройки - Графики - Макс.баров истории
#3574


vitek01 Попробуйте в МТ - Сервис - Настройки - Графики - Макс.баров истории


Не пройдет, возмите в тестере стратегий любую дату, прям любую, дальше назад 4 дней(На таймфрейме М5) он не отобразит. Также и с реаальной датой, советник видит только 1000 баров, для 5 минуток это 4 дня. И для каждого тайма 1000 баров, хоть месячные. А у меня цикл for, 1000 баров ему маловато!
#3575

у меня всё нормально с тестером. Кол-во баров в окне настраивали?

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

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