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

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

#2226




А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?

ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?



Точно!!! Спасибо! Нам на бае Селл-стоп нужен. А у меня Селл-лимит.
Осталось два вопроса:
1. Отложенный ордер открывается на уровне открытия существующего ордера, а нужно чтобы к нему что-то добавлялось/отнималось (в моем коде это pointForOrder).
2. Почему не срабатывает Print?

У меня работает.

//+------------------------------------------------------------------+
//| Защитные отложенные ордера.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern int pointForOrder = 500;
extern int Slippage = 5;

double open,pfo,volume;
int digits;
double point; // тип дабл
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double op=0,lt=0; string sy=NULL;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
op=OrderOpenPrice();
lt=OrderLots();
sy=OrderSymbol();
point=MarketInfo(sy,MODE_POINT);
digits=(int)MarketInfo(sy,MODE_DIGITS);

if(OrderType()==OP_BUY)
{
//if(digits == 3 || digits == 5) это дикий бред
//{
// pfo *= 10;
// Slippage *= 10;
//}

open=NormalizeDouble(op -pointForOrder*point,digits);
if(OrderSend(sy,OP_SELLSTOP,lt,open,Slippage,0,0)>=0)
Print("Успешно по символу ",sy);
else
Print("Ошибка по символу ",sy," ",GetLastError()," ",open);
}

if(OrderType()==OP_SELL)
{
open=NormalizeDouble(op+pointForOrder*point,digits);
if(OrderSend(sy,OP_BUYSTOP,lt,open,Slippage,0,0)>=0)
Print("Успешно по символу ",sy);
else
Print("Ошибка по символу ",sy," ",GetLastError()," ",open);
}
}
else return;
}
//+------------------------------------------------------------------+
#2227



У меня работает.



Блин, ошибка оказалась именно в типе Point!!! Я думал, что размер пункта в целый числах!

Почему ты считаешь проверку Digits бредом? У меня на Демо 4 знака, на Реале 5 знаков. Допустим pointForOrder = 500. Если покупаю на демо по цене 1,0900, то отложка выставляется на 1,0400.
Если покупаю на реале, то здесь уже вменяемая отложка 1,0850.

Также не разобрался, почему Print не работает. Запустил твой код, во вложении скрин (к названию добавил "1", чтобы не конфликтовал с моим файлом)

Print.jpg

#2228




У меня работает.



Блин, ошибка оказалась именно в типе Point!!! Я думал, что размер пункта в целый числах!

Почему ты считаешь проверку Digits бредом? У меня на Демо 4 знака, на Реале 5 знаков. Допустим pointForOrder = 500. Если покупаю на демо по цене 1,0900, то отложка выставляется на 1,0400.
Если покупаю на реале, то здесь уже вменяемая отложка 1,0850.

Также не разобрался, почему Print не работает. Запустил твой код, во вложении скрин (к названию добавил "1", чтобы не конфликтовал с моим файлом)

возможно не в тот журнал смотришь.
Второе проверка на дигитс не нужна, и не нужно писать тот бред который я назвал бредом.
при установке скрипта выведи так что бы открывались настройки, и в зависимости от типа счета 4 или 5 знаков ставь значения 50 или 500 ... И не привыкай писать такой код, этот фрагмент использовался в 2006-2008 годах когда 5 значные брокеры только стали появляться и что бы не было путаницы писали этот фрагмент, сейчас каждый трейдер знает свой тип счета. Дадите свой код поюзать другу и друг сразу получит минуса ...
Если собираетесь писать коды то учитесь правильному...
#2229

{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?

#2230


{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


Вы не проверяете результат работы OrderModify
#2231



{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


Вы не проверяете результат работы OrderModify


Если возможно покажите как правильно .
#2232




{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


Вы не проверяете результат работы OrderModify


Если возможно покажите как правильно .

if( OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red)==false)
Print("OrderModify Error ", GetLastError());
else
Print("OrderModify Ok ");
#2233

Помогите исправить ошибки , сам не справляюсь и покажите что не так чтоб мог проанализировать.

Новый_текстовый_документ.txt7 скач.

#2234


Помогите исправить ошибки , сам не справляюсь и покажите что не так чтоб мог проанализировать.


Поправил ошибки, логических ошибок не искал...

isprav.mq49 скач.

#2235

// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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

#2236


// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил

isprav.mq48 скач.

#2237



// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил


спасибо буду разбираться у вас немного все по другому в функциях.
#2238




// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил


спасибо буду разбираться у вас немного все по другому в функциях.

Потому что в Ваших вариантах вы не правильно ищете последние ордера и лоты и цены....
В общем разбирайтесь ...
#2239

Eсли есть у кого пример трелинг стопа выложите файлик , не как не разберусь в логике , и среднюю цену сетки ордеров чтоб найти нужно OrderOpenTime * OrderLots/Count ?

#2240

Товарищи программисты, помогите, пожалуйста, написать правильно код:

Условие: если предыдущий бар меньше 100 пунктов, то ...

Пишу так (для бычьей свечи): if ((Close[1]-Open[1])*Point
Ошибку компилятор не выдает, но при работе советник не учитывает размер свечи (есть и другие условия для входа, размер свечи - один из них)! Как буд-то этого условия и нет вовсе! Что не правильно?

#2241
nct21 надо: if ((Close[1]-Open[1]) / Point
Dron15 примеры трейлинга лучше поискать самому в кодабазе. у меня, конечно есть, но они уже очень не простые...
А вычислять среднюю цену сетки лучше с учётом лотности, т.е. точку безубытка:
сначала в цикле перебора ордеров сетки суммируем лотности ордеров и суммируем произведение лота на цену открытия.
затем, по завершению цикла, делим сумму(лот*цена) / сумму(лот)
...{
aSumLot += OrderLots();
aSumPrcLot += OrderOpenPrice() * OrderLots();
... }
prc_bu = NormalizeDouble(aSumPrcLot / aSumLot,_Digits);
#2242

Спасибо 0ll начну пробовать писать и как найти эту кодобазу ?

#2243
Кодабаза
#2244

Гляньте функцию пожалуйста ошибок не выдает видно логика неправильна не получается запустить

модифи_ордерс.txt7 скач.

#2245
Dron15 я посмотрел - там тихий ужас. x_x
По-моему Вы вообще не представляете что пишите. Без обид.
Что это:
OSL = NormalizeDouble(OrderStopLoss(),Digits)&& OrderType()== otype;
SL = OSL;
- не разгадал... тем более потом вычисляете SL, но не используете...

OrderModify - там цена конкретного, модифицируемого ордера, а не БУ!
По сути получается, что БУ вычислили, а что делать с ним не знаете?
Порядок такой:
- для трала есть 3 значения - дистанция для старта(tral_Start), дистанция СЛ(tral_Stop) и шаг изменения СЛ(tral_Step)
1. вычислили БУ
2. если от цены до БУ более чем tral_Start - включаем трал (больше ни для чего ЬУ не используется)
3. если от цены до СЛ более чем tral_Stop + tral_Step - модифицируем ордера
4. вычисляем СЛ = цена +- tral_Stop (это у Вас правильно)
5. собственно цикл модификации
#2246

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

#2247
Dron15 не стесняйся пиши. Вам нужно в разных функциях это делать.
1. при удачном открытии ордера вычисляем БУ (в отдельной функции или вместе с ф-цией контроля количества ордеров)
2. в ф-ции Старт контролируем момент для запуска трала (дистанцию от цены до БУ и СЛ)
3. если контроль сработал вычисляем новое значение СЛ
4. запускаем ф-цию модификации и передаём туда тип ордеров и новый СЛ.
#2248

Всем привет!
Вопрос следующего характера. Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?

#2249

Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?

Не знаю на чём индюк построен, но если на МА, то надо просто в 4 раза период увеличить и всё.
#2250

Привет все! Прошу подсказать новичку.
По учебному курсу мучаю трейлинг-стопы. Отладку не получается использовать. Пытаюсь через Print вывести время, в котором произошел вход в процедуру трейлинга. Тестирую на одном дне. В журнал сообщений почти всегда выходит время после 23:00. Изредка часть тиков показывает 18:00, а остальную после 23:00. Что я делаю не так?
как мне вывести время, чтобы понять на каком участке дня мой трейлинг-стоп не срабатывает?

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

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