Если уж что то делаешь, то предусматривай все варианты, у меня сейчас достаточно обширная собрание разных готовых функций, поэтому для написания советника мне нужно переписать всего 3 функции, собрать необходимый функционал и немного его подкорректировать, общих делов минимум, так что это твой скелет функции трала и ты его будешь использовать во многих своих роботах, поэтому неполенись \M/
Доработка советников: общая тема📌
От Garfik, 4 августа, 2011 в Уголок Программиста
Парни помогите пожалуйста нужна строчка к сове, нужно чтоб ПЛЮСОВАЯ сделка закрывалась по индикатору а не по тейкпрофиту.
Вот код открытия первой сделки.
//========================================================= Открытие первого Buy ==============================================
double StartLot ;
int ticketbuy=0, ticketsell=0 ;
if (TradeBuy && totalbuy==0){
if (ticketbuy ==0){
if (Signal > 0 ) {
DeleteObject() ;
StartLot = NormalizeDouble(Lot,dig);
if(Info) Print("Команда на открытие первого BUY");
comment=StringConcatenate("1-й ордер Buy, ","Magic : ",MagicNumber) ;
ticketbuy = SendOrder(OP_BUY , StartLot, 0, 0, MagicNumber, comment, Error);
if (!IsTesting() || IsVisualMode() || !IsOptimization()){
if (Info) PlaySound("alert.wav");
Sleep(1000); // если это не тестирование - "засыпаем" на 1 секунду.;
}
}
}
}
Сигнал на покупку даёт строчка (Signal > 0 )
Добавлено: 19-09-2013 03:34:15
вроде нашёл код,
но надо теперь чтоб только плюсовые закрывал
if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber) {
if (OrderType() == OP_BUY) {
if (Signal OrderClose(OrderTicket(),OrderLots(),Bid,1); // закрываем позицию
} }
//--------------------------------------------------------
if (OrderType() == OP_SELL) {
if (Signal > 0 ){
OrderClose(OrderTicket(),OrderLots(),Ask,1); // закрываем позицию
} } }
Изменено 19 сентября, 2013 пользователем ss1975
Ну можно просто добавить немного условий.
if (OrderType()==OP_BUY)
{
if (OrderOpenPrice() {
Функция закрытия данного ордера
}
}
if (OrderType()==OP_SELL)
{
if (OrderOpenPrice()>Ask)
{
Функция закрытия данного ордера
}
}
ну это примерный алгоритм, сам подкорректируешь как тебе надо
Спасибо.
но немного сделал по другому,
if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber) {
if (OrderType() == OP_SELL) {
if (Signal > 0 ){
if (SumProfit >0){
OrderClose(OrderTicket(),OrderLots(),Ask,1); // закрываем позицию
} }}}}
вроде работает)
эт я над интегрой изголяюсь))
Добавлено: 20-09-2013 04:00:19
Помогите доделать сигнального советника. сдаётся мне что я не то делаю
extern string Sound = "alert.wav"; //-- звуковой файл
//-------------------------------------------------------------------
int Bar_Count;
int Signal;
//-------------------------------------------------------------------
int init()
{
Bar_Count = iBars(Symbol(), Period());
return(0);
}
//-------------------------------------------------------------------
int start()
{
GetSignal();
if(Bar_Count {
if (Signal {
PlaySound(Sound);
}
Bar_Count = iBars(Symbol(), Period());
}}
///////////////////////////////////////////////////////////////////////////
if(Bar_Count {
if (Signal > 0 ){
{
PlaySound(Sound);
}
Bar_Count = iBars(Symbol(), Period());
}}
/////////////////////////////////////////////////////////////////////////
return(0);
}
//------------------------------------------------------------------
//+-------------------------------------------------------------------------------------+
//| Генерация сигналов покупки и продажи по значениям двух стохастиков |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
Signal = 0;
// - 1 - == Получение показаний индикатора ==============================================
double main1 = iCustom(NULL, 0, "Trend", 0, 1);
double main2 = iCustom(NULL, 0, "Trend", 0, 2);
double sign1 = iCustom(NULL, 0, "Trend", 1, 1);
double sign2 = iCustom(NULL, 0, "Trend", 1, 2);
// - 1 - == Окончание блока =============================================================
// - 2 - == Генерация сигнала покупки ===================================================
if (main1 != EMPTY_VALUE && main2 != EMPTY_VALUE// Линия сменила цвет с красного на..
&& sign1 == EMPTY_VALUE && sign2 != EMPTY_VALUE)// ..голубой
Signal = 1;
// - 2 - == Окончание блока =============================================================
// - 3 - == Генерация сигнала продажи ===================================================
if (sign1 != EMPTY_VALUE && sign2 != EMPTY_VALUE// Линия сменила цвет с голубого на..
&& main1 == EMPTY_VALUE && main2 != EMPTY_VALUE)// .. красный
Signal = -1;
// - 3 - == Окончание блока =============================================================
return(0);
Добавлено: 20-09-2013 07:22:27
Вроде сделал)
//+------------------------------------------------------------------+
//| MA_Gudok.mq4 |
//+------------------------------------------------------------------+
extern string Sound = "ss.wav"; //-- звуковой файл
//-------------------------------------------------------------------
int Signal;
int text;
int Bar_Count;
//-------------------------------------------------------------------
int init()
{
Bar_Count = iBars(Symbol(), Period());
return(0);
}
//-------------------------------------------------------------------
int start()
{
CheckMACross();
if(Bar_Count
{ if (Signal PlaySound(Sound);
//Alert (text+"SELL"); // Есть пересечение
Comment("ПОРА В SELL-УДАЧИ ");
Sleep(1000);
}
Bar_Count = iBars(Symbol(), Period());
}
//////////////////////////////////////////////////////
{ if (Signal > 0 ){
PlaySound(Sound);
Comment("ПОРА В BAY-УДАЧИ ");
//Alert (text+"BAY"); // Есть пересечение
Sleep(1000);
}
Bar_Count = iBars(Symbol(), Period());
}
return(1);
}
//------------------------------------------------------------------
int CheckMACross()
{
Signal = 0;
// - 1 - == Получение показаний индикатора ==============================================
double main1 = iCustom(NULL, 0, "Trend", 0, 1);
double main2 = iCustom(NULL, 0, "Trend", 0, 2);
double sign1 = iCustom(NULL, 0, "Trend", 1, 1);
double sign2 = iCustom(NULL, 0, "Trend", 1, 2);
// - 1 - == Окончание блока =============================================================
// - 2 - == Генерация сигнала покупки ===================================================
if (main1 != EMPTY_VALUE && main2 != EMPTY_VALUE// Линия сменила цвет с красного на..
&& sign1 == EMPTY_VALUE && sign2 != EMPTY_VALUE)// ..голубой
Signal = 1;
// - 2 - == Окончание блока =============================================================
// - 3 - == Генерация сигнала продажи ===================================================
if (sign1 != EMPTY_VALUE && sign2 != EMPTY_VALUE// Линия сменила цвет с голубого на..
&& main1 == EMPTY_VALUE && main2 != EMPTY_VALUE)// .. красный
Signal = -1;
// - 3 - == Окончание блока =============================================================
return(0);
}
Изменено 20 сентября, 2013 пользователем ss1975
Вопрос все еще актуален, нужные функции есть в MT4i - TradeCopy декомпил обеих сов прилагаю. Возможно, кому-то удастся доработать советник.
ЦитатаIncludeSymbols If not blank, a comma-separated list of symbols to include in the
messages to the receiver. This must exactlymatch the broker’s
names, including upper/lower case such as
EURUSDfx,GBPUSDfx. Trades for symbols which are not on
this list are not included.
IncludeMagicNumbers If not blank, a comma-separated list of EA magic numbers to
include in the messages to the receiver. For example,
0,1234,6789 will include manual orders (which have magic
number 0), plus orders from the EA(s) which use the magic
numbers 1234 and 6789
вот здесь мне нужно сделать подсчет сколько баров "живет" открытый ордер... а то я уже себе голову сломал)))
Выбираем ордер, потом
(TimeCurrent() - OrderOpenTime())/Таймфрейм*60
Таймфрейм в минутах. Если у тебя определенный можно написать PERIOD_M15 например.
Как автаматом узнать ТФ хз, сделай внешнию переменную пусть пользователь сам введет.
Выбираем ордер, потом
(TimeCurrent() - OrderOpenTime())/Таймфрейм*60
Таймфрейм в минутах. Если у тебя определенный можно написать PERIOD_M15 например.
Как автаматом узнать ТФ хз, сделай внешнию переменную пусть пользователь сам введет.
текущий таймфрейм возвращает функция Period()
таким образом получим:
bars = MathFloor((TimeCurrent() - OrderOpenTime())/Period()*60.0);
Можно также рассчитать с помощью функции iBarShift, которая возвращает номер бара по времени.
Только нужно учитывать, что нумерация обратная - тоесть нужно от более раннего отнимать познее время:
bars = iBarShift(NULL, 0, OrderOpenTime()) - iBarShift(NULL, 0, TimeCurrent());
помогите, плз, прикрутить трал к советнику. Не знаю куда вставлять изменение ордера,чтобы проверял и корректировал 1 раз за свечу. Заранее благодарен
помогите, плз, прикрутить трал к советнику. Не знаю куда вставлять изменение ордера,чтобы проверял и корректировал 1 раз за свечу. Заранее благодарен
У Вас уже есть контроль открытия нового бара, и мне кажеться, что лучше всего вставить в блок 5 в оператор else для if (Signal != 0)...
Таким образом, если на текущем баре не было сигнала для открытия ордеров, то можем модифицировать существующие.
Также можно вынести функцию FindOrders(); из Trade и поставить ее перед оператором if: она нужна и для открытия ордеров и для трала, поэтому чтобы не дублировать вызов, лучше это сделать заранее.
Подскажите пожалуйста, где я допустил ошибку или я ее недопустил? Уже несколько часов безуспешно бьюсь над этим незамысловатым наполнением массива, удалось локализовать баг в данном куске кода. Для проверки этого прописал в начале функции цикл вывода массива. Но в результате в журнале говорится, что каждое значение массива равно 0. Непомогли ни перевод переноса значений в основной цикл, ни даже перевод всей структуры на Bool значения.
extern int Kd1=1;
extern int Kd2=0;
extern int Kd3=0;
extern int Kd4=0;
extern int Kd5=1;
extern int Kd6=1;
extern int Kd7=1;
extern int Kd8=0;
extern int Kd9=0;
extern int Kd10=0;
static int Order[];
int init()
{
Order[0]=Kd1;
Order[1]=Kd2;
Order[2]=Kd3;
Order[3]=Kd4;
Order[4]=Kd5;
Order[5]=Kd6;
Order[6]=Kd7;
Order[7]=Kd8;
Order[8]=Kd9;
Order[9]=Kd10;
return(0);
}
int start()
{
for (int i=0; i {
Print ("Значение буфера ",i, " ", Order);
}
//....
return(0);
}
А жестко прописывать в условиях каждый вариант нехотелось бы. Буду благодарен за подсказки.
Подскажите пожалуйста, где я допустил ошибку или я ее недопустил? Уже несколько часов безуспешно бьюсь над этим незамысловатым наполнением массива, удалось локализовать баг в данном куске кода. Для проверки этого прописал в начале функции цикл вывода массива. Но в результате в журнале говорится, что каждое значение массива равно 0. Непомогли ни перевод переноса значений в основной цикл, ни даже перевод всей структуры на Bool значения.Спойлерextern int Kd1=1;
extern int Kd2=0;
extern int Kd3=0;
extern int Kd4=0;
extern int Kd5=1;
extern int Kd6=1;
extern int Kd7=1;
extern int Kd8=0;
extern int Kd9=0;
extern int Kd10=0;
static int Order[];
int init()
{
Order[0]=Kd1;
Order[1]=Kd2;
Order[2]=Kd3;
Order[3]=Kd4;
Order[4]=Kd5;
Order[5]=Kd6;
Order[6]=Kd7;
Order[7]=Kd8;
Order[8]=Kd9;
Order[9]=Kd10;
return(0);
}
int start()
{
for (int i=0; i {
Print ("Значение буфера ",i, " ", Order);
}
//....
return(0);
}
А жестко прописывать в условиях каждый вариант нехотелось бы. Буду благодарен за подсказки.
Массив хоть и указан без размера, но он не динамический как в некоторых языках.
Нужно перед использованием масива установить его размер с помощью ArrayResize(Order, 10);
и модификатор static там бесполезен: массив и так объявлен как глобальная переменная.
Изменено 7 декабря, 2017 пользователем Pavel888
Сова привязана к счету, можно открутить как нибудь?) чтобы использовать с другими счетами
но я бы обиделся, если бы с моим экспертом так поступили.
Делись уж теперь, чо за сова, какие ТФ, пары? ))
Сова привязана к счету, можно открутить как нибудь?) чтобы использовать с другими счетами
в советнике нет привязки к счету...
accountNumber = 0;
пусть так и остаётся...
Сова привязана к счету, можно открутить как нибудь?) чтобы использовать с другими счетами
в советнике нет привязки к счету...
accountNumber = 0;
пусть так и остаётся...
Ну так правильно, я уже убрал привязку. В оригинале там стоял номер счёта.
Цитата
Ну так правильно, я уже убрал привязку. В оригинале там стоял номер счёта.
упс... :)
пора спать!
Друзья, взгляните в свободное время, плиз.
Вроде, как интересный советник для M1, на демо (Alpari, ECN) неплохо торгует. Ключ в архиве, работает до 9 ноября.
Убрал ограничение по времени...
Рекомендую оформить тему как положено для советников...
Изменено 5 ноября, 2013 пользователем xbms
Помогите пожалуйста доработать советник e-News-Lucky , которым с нами великодушно поделился Павел, что бы коэффициент лота к депозиту был постоянный. При росте депозита - рос и лот.
Депозит 1000 - лот 0,70; Депозит 1500 - лот 1,05; Депозит 2000 - лот 1,40; и пример на понижение: Депозит 500 - лот 0,35.
Только чтобы лот плавно рос в след за плавно растущим депозитом, и также плавно уменьшался при уменьшении депозита. Ну и чтобы была возможность выставить первоначальный лот не только 0,7 к 1000, но и другие значения.
Только если кто возьмется сделать такое, пожалуйста другие параметры советника не трогайте, не изменяйте.
держи...
Друзья! У меня при компиляции одного советника компилятор выдал 3 предупреждения. Советник был декомпилирован. Вот они:
'f0_1' - comparison expression expected (93, 14)
'f0_4' - comparison expression expected (380, 14)
'f0_4' - comparison expression expected (491, 8)
В чем причина? Как их убрать и влияют ди они на функционал советника. Вот код к которому относятся ошибкиж ( строки с ошибками помечены комментариями // ЭТА СТРОКА)
'f0_1' - comparison expression expected (93, 14)
error_92 = GetLastError();
if (error_92 == 128/* TRADE_TIMEOUT */ || error_92 == 142 || error_92 == 143) {
Sleep(66000);
if (f0_1(A_symbol_0, A_cmd_8, A_magic_44, datetime_64)) { // ЭТА СТРОКА
PlaySound("expert.wav");
return;
}
Print("Error(", error_92, ") set order: ", ErrorDescription(error_92), ", try ", Li_96);
} else {
--------------------------------------------------------
'f0_4' - comparison expression expected (380, 14)
if (error_84 == 128/* TRADE_TIMEOUT */ || error_84 == 142 || error_84 == 143) {
Sleep(66666.0);
if (f0_4(A_symbol_0, A_cmd_8, A_magic_36, datetime_52)) { // ЭТА СТРОКА
PlaySound("alert2");
break;
}
}
--------------------------------------
'f0_4' - comparison expression expected (491, 8)
if (f0_4("", -1, MagicNumber)) { // ЭТА СТРОКА
if (a1(Ld_0, TrailingStop, TrailingStart, AccountBalance())) {
if (a2(Gd_196, Ld_0, TrailingStop, TrailingStep, AccountEquity())) {
Gd_196 = Ld_0 - TrailingStop;
Alert(AccountCompany(), " Достигнут новый уровень профита." + DoubleToStr(Gd_196, 0));
}
}
} else Gd_196 = -999999999;
Возможно стоит проверить как объявлены эти функции. По тому как их используют они должны иметь Тип bool и для того чтобы уж наверняка исключить, в условия их использования стоит вписать сравнение по типу if (f0_1(A_symbol_0, A_cmd_8, A_magic_44, datetime_64)==True) или if (f0_1(A_symbol_0, A_cmd_8, A_magic_44, datetime_64)==1)
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем