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

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

#776

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

Спасибо Вам большое за проделанную работу))

#777


о создании советников, использующих стоп-лоссы.



Это максимально разобрано в каждом из уроков. x_x
#778



о создании советников, использующих стоп-лоссы.



Это максимально разобрано в каждом из уроков. x_x


Вы не правы, стратегия у всех советников основана на принципе мартингейла. Хотелось бы послушать процесс создания стратегии без усреднения
#779

А вам что не понятно, как и от куда рассчитывать стоп лосс ? Мне допустим было ясно и без языка программирования.Так вот там, то же самое, в уроках есть как ставить стопы и как тралить,почти любым способом.Пересмотрите урок как добавить в советник трелинг стоп. Я думаю господин xbms не случайно взял пример написания советника на мартине или сеточник,для начинающего это довольно сложный код.там довольно в полной мере описывается логика программы.что за чем должно следовать и все вычисления.посидеть подумать можно написать простенький код без усреднения. В общем думайте,голова для этого дана,не только в нее ложку заталкивать.

#781

:-HДобрый день.Искал в ветке, но так и не нашел. Может кто подскажет, как модифицировать к примеру 2 ордера на разных валютах по принципу мартингейла?На одной валюте понятно, а так чтобы получить б/у по 2 парам не понятно.Спасибо за любой ответ.

#782

Здраствуйте, вы не могли бы мне помочь, Пишу советник, смысл в том, чтобы при прохождении цены в какую либо сторону открыть ордер в сторону движения цены. Если цена развернётся и сработает СтопЛосс, открылся новый ордер от стопа, опять по движению ценыС теми же СЛ и ТП. Первый ордер открываеться без проблем, а второе условие не срабатывает. Помогите в чём ошибка (((

Спойлер

//+------------------------------------------------------------------+
//| Plan B 3.mq4 |
//| C |
//| http:/ |
//+------------------------------------------------------------------+
#property copyright "C"
#property link "http:/"
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 150;
extern int StopLoss = 50;
extern int Slippage = 5;
extern string comment = "Tma Bot";
extern int Magic = 12345;


extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigt, PriceLow, SL, TP, price;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}


return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigt = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

if (Ask >= PriceHigt && CountBuy() + CountSell() == 0)
{

SL =NormalizeDouble(Ask - StopLoss * Point, Digits);
TP =NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}


}


if (Bid {
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}

}


if (CountTrades() == 0 && FindLastOrderType() == OP_SELL && Ask >= NormalizeDouble(FindLastPrice(OP_SELL) + StopLoss*Point, Digits))
{

SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}



}

if (CountTrades() == 0 && FindLastOrderType() == OP_BUY && Bid {

SL = NormalizeDouble(Ask + StopLoss * Point, Digits);
TP = NormalizeDouble(Ask - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}



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

int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
if (OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for( int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}

//+------------------------------------------------------------------+

int FindLastOrderType()
{
for (int i = OrdersTotal()-1; i>=0; i-- )
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}


//+------------------------------------------------------------------+
int CountTrades()

{
int count = 0;
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}
return(count);


}



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

Спойлер

//+------------------------------------------------------------------+
//| Plan B ch3.mq4 |
//| C |
//| http:/ |
//+------------------------------------------------------------------+
#property copyright "C"
#property link "http:/"
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 60;
extern int StopLoss = 20;
extern int inTakeProfit = 20;
extern int inStopLoss = 15;
extern int Step = 21;
extern int Slippage = 3;
extern int Magic = 12345;
extern string comment = "Делаю Деньги";
extern double Multipler = 2;

extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double TP, SL, SL2, TP2, inTP, inSL, inTP2, inSL2, price, lastlot, PriceHigt, PriceLow;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Step *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

PriceHigt = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

if (Ask >= PriceHigt && CountBuy() + CountSell() == 0)
{

SL =NormalizeDouble(Ask - StopLoss * Point, Digits);
TP =NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}


}


if (Bid {
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket >0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);


}

}

else
{
int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if((price - Bid)/Point >= StopLoss)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit * Point, Digits);
SL = NormalizeDouble(OrderOpenPrice() + StopLoss * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}
}

int order_type = FindLastOrderType();
if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL);
if((Ask - price)/Point >= StopLoss)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Red);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit * Point, Digits);
SL = NormalizeDouble(OrderOpenPrice() - StopLoss * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}

}
//+------------------------------------------------------------------+
int CountBuyStop()
{
int count = 0;

for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP )
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+

int CountSellStop()
{
int count = 0;

for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP )
count ++;
}
}
return(count);

}
//+------------------------------------------------------------------+
void DeleteOrders()
{
for(int trade=OrdersTotal() -1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket(), Black);
}
}
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
if (OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+

int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
if (OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
double oldlots;
int oldticket;

ticket = 0;
for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype )
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for( int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}

//+------------------------------------------------------------------+

int FindLastOrderType()
{
for (int i = OrdersTotal()-1; i>=0; i-- )
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}


//+------------------------------------------------------------------+
int CountTrades()

{
int count = 0;
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}
return(count);


}



Изменено 18 марта, 2014 пользователем Алексей7779000

#783

раставь GetLastError(); и принты после каждого условия и смотри журнал найдёшь где глючит
также обнуление переменных в функциях oldopenprice и тд и тп
размер лота проверь если на твоём типе счёта мин лот 0.1 то в настройках должно быть 0.1 а не 0.01

Изменено 18 марта, 2014 пользователем pegaskrs

#784


:-HДобрый день.Искал в ветке, но так и не нашел. Может кто подскажет, как модифицировать к примеру 2 ордера на разных валютах по принципу мартингейла?На одной валюте понятно, а так чтобы получить б/у по 2 парам не понятно.Спасибо за любой ответ.



Вместо Symbol() в функции модификации указываешь какой символ необходимо модифицировать.
#785

Здравствуйте, помогите пожалуйста...

Если мне нужно взять данные например с ЕМА 5 наложенного на график цены то я делаю так:

double Tg;

Tg =iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,i);

подскажите плз. как взять данные индикатора MA который наложен например на RSI и берёт данные не с графика цены, а с осцилятора RSI и строится в нём по его данным, т.е. Apply to : First Indicator's Data

Заранее спасибо.

#786

Ошибка в том, что когда ордер закрывается то он уже не в списке активных, а истории.
Поэтому нужно там его искать:


// retrieving info from trade history
int i,accTotal=OrdersHistoryTotal();
for(i=0;i {
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
// работа с ордером ...
}

Автор#787

Что-то не видно активности, решений задачки по уроку... :)
Урок с классами показался тяжёлым?
Дальше будет ещё сложней... наследование, инкапсуляция и т.д.
Во сколько новых слов :)

#788

Господин xbms,Сергей дайте время переворотить информацию,допустим я сейчас пытаюсь
сложить в кучу ваши два урока.Но пока не очень успешно,я пока сам код не напишу хотя бы какой нибудь который работать будет.Подчеркиваю,свой то есть свою идею. Я не пойму как это все работает,списать легко,разобраться в этом сложнее.По этому наверное нет не кого.


Добавлено: 22-03-2014 14:17:07

Господин XBMS у меня просьба к вам такого плана,могли вы помочь разобраться с кодом.
На одном из форумов один отзывчивый программист набросал мне часть кода.как раз получается из области ваших не давних уроков.В сообщение выше я писал уже причину не понимания пока всего этого.Я хотел написать функцию наверное известной вам ТС Кукловод открытия хотя бы одной корзины ордеров.Просьба заключается в следующем,я совсем не понял как там работать все должно.там явно чего то не хватает.Подскажите чего ? Если вас не затруднит посмотреть код и построчно дать комментарии,ото я там совсем заблудился ! >:d :(

Спойлер

[
string Smbl[];
int CntBuy[],CntSell[];

void OnStart()
{
if(CountBuySell(Smbl, CntSell, CntBuy))
for(int i=0; i, CntBuy, CntSell);
}
//---------------------------------------------------------------++
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
int ot,n,N=0,f=0,cb=0,cs=0;
string symbol;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

ot=OrderType()+1; if(ot>2) continue; // пропускаем лимит ордера
symbol=""; symbol=OrderSymbol(); if (symbol=="") continue; // убедились что символ выбран
f=0; cb=0; cs=0; // обнулили счетчики и флаг символа
for (n=0; n if (f==0) // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
{
N++;
ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
}

if(ot==1) cb++; // OP_BUY для выбранного символа
else cs++; // OP_SELL

// перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
// такоим образом для каждого индекса всех 3 массивов будет соответствовать конкретный символ и количество позиций покупки и продажи для него
for (n=0; n
}
}
if(N>0) return(1); // есть открытые позиции
return(0); // позиций нет
}

//-------------------------------------------------------------------------++
]

Изменено 22 марта, 2014 пользователем denis77515

Автор#789


Господин xbms,Сергей дайте время переворотить информацию,допустим я сейчас пытаюсь
сложить в кучу ваши два урока.Но пока не очень успешно,я пока сам код не напишу хотя бы какой нибудь который работать будет.Подчеркиваю,свой то есть свою идею. Я не пойму как это все работает,списать легко,разобраться в этом сложнее.По этому наверное нет не кого.


Добавлено: 22-03-2014 14:17:07

Господин XBMS у меня просьба к вам такого плана,могли вы помочь разобраться с кодом.
На одном из форумов один отзывчивый программист набросал мне часть кода.как раз получается из области ваших не давних уроков.В сообщение выше я писал уже причину не понимания пока всего этого.Я хотел написать функцию наверное известной вам ТС Кукловод открытия хотя бы одной корзины ордеров.Просьба заключается в следующем,я совсем не понял как там работать все должно.там явно чего то не хватает.Подскажите чего ? Если вас не затруднит посмотреть код и построчно дать комментарии,ото я там совсем заблудился ! >:d :(

Спойлер

[
string Smbl[];
int CntBuy[],CntSell[];

void OnStart()
{
if(CountBuySell(Smbl, CntSell, CntBuy))
for(int i=0; i, CntBuy, CntSell);
}
//---------------------------------------------------------------++
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
int ot,n,N=0,f=0,cb=0,cs=0;
string symbol;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

ot=OrderType()+1; if(ot>2) continue; // пропускаем лимит ордера
symbol=""; symbol=OrderSymbol(); if (symbol=="") continue; // убедились что символ выбран
f=0; cb=0; cs=0; // обнулили счетчики и флаг символа
for (n=0; n if (f==0) // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
{
N++;
ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
}

if(ot==1) cb++; // OP_BUY для выбранного символа
else cs++; // OP_SELL

// перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
// такоим образом для каждого индекса всех 3 массивов будет соответствовать конкретный символ и количество позиций покупки и продажи для него
for (n=0; n
}
}
if(N>0) return(1); // есть открытые позиции
return(0); // позиций нет
}

//-------------------------------------------------------------------------++
]



Денис, теперь уже мне нужно время разобраться.
Т.к. я какое-то время не следил за форумом, ибо некогда, и по сему ТС "Кукловод" мне незнакома :)
Как только найду время - разберусь и попробую помочь.
#790

Сергей, спасибо за вашу отзывчивость! =d>

#791

Как можно исправить ошибки в индикаторах для нового терминала, содержащих char ?

if((char > 96 && char 223 && char s = StringSetChar(s, lenght, char - 32);
else
if(char > -33 && char s = StringSetChar(s, lenght, char + 224);
lenght--;

T3_clean.mq47 скач.

Изменено 22 марта, 2014 пользователем Юла

Автор#792


Как можно исправить ошибки в индикаторах для нового терминала, содержащих char ?

if((char > 96 && char 223 && char s = StringSetChar(s, lenght, char - 32);
else
if(char > -33 && char s = StringSetChar(s, lenght, char + 224);
lenght--;



в данном случае char идёт как переменная... её можно просто назвать по другому, ну или например добавить символ подчёркивания "_", будет как "char_", хотя в этом коде и других проблем хватает...
#793

Всем Привет!
Может кто подсказать, где я напортачил.
Про бывал написать советник на основе индикатора ATR_the_bat пока без фибоначи просто при пробитии линии заключал сделку, но если цена идет выше линии он открывает море ордеров.
Писал на основе 3 урока.
За ранее спасибо!
Ну зачем эти символы при каждом сообщение и т.д. не захочешь общаться даже после это чуши

ATR_bot.mq410 скач.
ATR_the_bat.mq49 скач.

#794

Вот смотри в строчке if (Ask >=PriceHigh && CountSell() == 0) уже ошибка.
if (Ask >=PriceHigh если вот это условие не выполняется ,то вот это && CountSell() == 0) игнорируется совсем.Тебе нужно было записать условие проверки ордеров как во всех уроках if( OrdersTotal() == 0 && CountBuy() == 0 && CountSell() == 0)
{
.............
}

#795


Вот смотри в строчке if (Ask >=PriceHigh && CountSell() == 0) уже ошибка.
if (Ask >=PriceHigh если вот это условие не выполняется ,то вот это && CountSell() == 0) игнорируется совсем.Тебе нужно было записать условие проверки ордеров как во всех уроках if( OrdersTotal() == 0 && CountBuy() == 0 && CountSell() == 0)
{
.............
}


спасибо сейчас гляну

Добавлено: 24-03-2014 11:14:20

А почему в первом варианте открывал позицию по линии индюка, а после исправления сразу и после закрытия тоже в этом же направлении

Изменено 24 марта, 2014 пользователем 35aleks

#796

Со скобками подумать надо,я сейчас попробовал накидать эту сову,у меня то же получилось,что открывает только Sell ордера.условие на пакупку не выполняются,надо подумать почему ? Посмотри если есть желание.

Спойлер

[//+------------------------------------------------------------------+
//| 1.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Klonoz Denis 06.03.2014"
#property link "skype-denis77515"
#property version "1.00"
#property strict

extern double Lots = 0.01;
extern int TakeProfit = 100;
extern int StopLoss = 30;
extern int Slippage = 5;
extern string comment = "ATR boot";
extern int Magic = 123;
extern string indi = "Prametr indik";
extern int BackPeriod = 1000;
extern int ATRPeriod = 3;
extern double Factor = 3;
extern bool TypicalPrice = false;

double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(Symbol(), 0, "ATR_the_bat", BackPeriod, ATRPeriod, Factor,0,0);
PriceLow = iCustom(Symbol(), 0, "ATR_the_bat", BackPeriod, ATRPeriod, Factor,1,0);

if(OrdersTotal()==0 && CountBuy() == 0 && CountSell() == 0)
{
if(Ask>=PriceHigh)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
}
if (ticket > 0)
ModifyOrderBuy();


if (Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
}
if (ticket > 0)
ModifyOrderSell();


}//if (OrdersTotal()==0 && CountBuy() == 0 && CountSell() == 0)



}
//+------------------------------------------------------------------+
void ModifyOrderBuy()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()== OP_BUY)
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);

}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrderSell()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()== OP_SELL)
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);

}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
{
if(OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
{
if(OrderType() == OP_BUY)
count++;
}
}
return(count);
}
]

#797

а у меня только бай


Добавлено: 25-03-2014 06:52:02

Все разобрался. Там нужно поменять местами CountSell с CountBuy.
Кто может подсказать как прикрутить фибо уровни что бы по ним открывались отложники?

Добавлено: 25-03-2014 07:04:50

с фибо разобрался как сделаю советник выложу

Изменено 25 марта, 2014 пользователем 35aleks

#798

Здравствуйте! :)

Подскажите пожалуйста в чём может быть проблема.
Ругается на одни и те же функции...

Пример кода

//+------------------------------------------------------------------+
int CountSell()
{
for(int trade = OrdersTotal() -1; trade >=0; trade--)
{
[glow=yellow,2,300]OrderSelect[/glow](trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
Count++;
}
}
return(Count);
}
//+------------------------------------------------------------------+
void CloseOrders()
{
for(int trade=OrdersTotal()-1; trade >= 0; trade--)
{
[glow=yellow,2,300]OrderSelect[/glow](trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
[glow=yellow,2,300]OrderDelete[/glow](OrderTicket(), Black);
}
}
}
//+------------------------------------------------------------------+


warning.jpg

Изменено 26 марта, 2014 пользователем Redeemer

#799

Я не понял, как работает ChartID

код из справки:

   
string obj_name="label_object";
long current_chart_id=ChartID();
//--- создаем объект типа label
if(!ObjectCreate(current_chart_id,obj_name,OBJ_LABEL,0,0,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return;
}


тупо не работает:
2014.03.26 17:11:24.105 2014.01.02 09:59 Buttons USDCHF,H1: Ошибка создания объекта: code #4202

Код ошибки #4202 из той же справки гласит: 4202 ERR_OBJECT_DOES_NOT_EXIST Объект не существует
Под объектом, видимо, имеется в виду несуществующий график.

При этом, если вместо current_chart_id подставить 0
т.е. вместо:
long current_chart_id=ChartID();
написать
long current_chart_id=0;

, то всё работает.

Как это понимать? Кто из нас глючит?

Добавлено: 26-03-2014 13:48:02


Спойлер

Я не понял, как работает ChartID

код из справки:

   
string obj_name="label_object";
long current_chart_id=ChartID();
//--- создаем объект типа label
if(!ObjectCreate(current_chart_id,obj_name,OBJ_LABEL,0,0,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return;
}


тупо не работает:
2014.03.26 17:11:24.105 2014.01.02 09:59 Buttons USDCHF,H1: Ошибка создания объекта: code #4202

Код ошибки #4202 из той же справки гласит: 4202 ERR_OBJECT_DOES_NOT_EXIST Объект не существует
Под объектом, видимо, имеется в виду несуществующий график.

При этом, если вместо current_chart_id подставить 0
т.е. вместо:
long current_chart_id=ChartID();
написать
long current_chart_id=0;

, то всё работает.

Как это понимать? Кто из нас глючит?




Нашелся ответ опытным путем. Это работает в он-лайне. В тестере не хочет. События, кажется, тоже в тестере не работают.

Добавлено: 26-03-2014 13:48:55

это ужасно :((

Изменено 26 марта, 2014 пользователем fv2500

#800

Можете подсказать как прописать что бы профит был в валюте, не в пунктах?
по общему балансу счета что бы все закрыл

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

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