Предлагаю всем миром написать советник по ТС Кукловод.

От denis77515, 10 марта, 2014 в Архив

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

Предлагаю всем миром написать советник по ТС Кукловод,если господа профессиональные программисты помогут,и пользоваться им только людям зарегистрированным на этом сайте.Прилагаю мою версию советника.Простите но ее точно дорабатывать надо.

Puppet_Master_v_1.1..mq450 скач.

Автор#2

Я тут по ходу один,сам с собою общаться буду. =))

#3

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

#4

Для мультивалютных советников невозможно провести адекватные и корректные бектесты, а если нельзя проверить, то он никому и не нужен. Форвард тесты стратегии уже ведутся, результаты положительные, для быстрого открытия и закрытия корзин в теме уже есть скрипты(авторам отдельное спасибо и плюсы) - этого пока достаточно! >:d

Изменено 17 марта, 2014 пользователем master_ice

#5

О! Мне кажется я туда попал!
Народ, я не програмер. Но могу сделать счета на реале и создать мониторинг для каждой корзины.
Что хотелось бы видеть в сове.
Открытие по показаниям индикатора через 15 минут после открытия дневной свечи. Если показания в нужном диапазоне, должна делаться проверка, есть ли открытые ордера. Если нет, то открывать, если есть, то ничего не делать (на тот случай, если ордера были закрыты в ручную, я иногда так делаю). Стоп лосс и тэйк профит должны задаваться во входных параметрах как сумма пунктов по всем открытым ордерам. Так же стоп лос должен срабатывать, если показания переходят в противоположную зону (например если открывались по показаниям плюс 10-30, а индикатор показывает минус 10-30). Эти проверки должны делаться раз в сутки, через 15 минут после открытия дневной свечи. В свою очередь если ТП по пунктам не сработал, он должен срабатывать при достижении показателя плюс/минус 70. Так же проверять раз в сутки по показаниям закрытия индикатора на предыдущей свече.
Если ТП и СЛ во входящих параметрах 0 - тогда закрывать только по СЛ и ТП по показателям индикаторов.
У меня есть VPS, если эта логика реализована, могу поставить тестить на реал.

#6

mql5 в помощь. В МТ5 можно мультивалютки тестить.

#7


mql5 в помощь. В МТ5 можно мультивалютки тестить.


Самое то для мультивалютных советников, вот только спред там не поменять и разнонаправленные ордера по одной валютной паре не открыть
#8



mql5 в помощь. В МТ5 можно мультивалютки тестить.


Самое то для мультивалютных советников, вот только спред там не поменять и разнонаправленные ордера по одной валютной паре не открыть


Разнонаправленные ордера можно эмулировать математикой. Т.е. перезакрывать с высчитыванием лота.
Метаквоты не такие дураки, чтоб исключив локи не предложить замену.
Локи и хеджи - это чисто человеческая психология, которая не дает преимуществ в торговле. А висящие в локе куча ордеров дает лишнюю нагрузку на депо в виде залога.
В ботах локи точно зло. Это только для человека типа "надежда"

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

loki.jpg

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

Автор#9

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

#10

В шапке уже поправлення версия или еще старая?

Автор#11

Еще старая,она ордера открывает нормально,а вот с закрытием я там накасячил.Сейчас время пока нету заняться переделать.

#12

Можно выложить последнюю версию? Хочу посмотреть что там исправленно.

Автор#13

В целом пока не чего не исправлял,поправил функции закрытия. Но, смотрю, не совсем уверен что правильно.

Спойлер

[//+------------------------------------------------------------------+
//| Kuklovod_1.0_AUTO..mq4 |
//| Klonoz Denis 06.03.2014 |
//| skype-denis77515 |
//+------------------------------------------------------------------+
#property copyright "Klonoz Denis 06.03.2014"
#property link "skype-denis77515"
#property version "1.00"
#property strict
extern bool USD = true;
extern bool GBP = true;
extern bool JPY = true;
extern double Lots = 0.1;
extern bool lots = true;
extern string _ = "прогресия лота на каждые 500 баланса +0.1 лот.";
extern string __ = "например депозит стал 1000 лот =0.2,";
extern string ___ = "1500 лот =0.3 и т.д";
extern double MaximumRisk = 0.03;
extern double DecreaseFactor = 3.0;
extern string ____ = " Шаг баланса.";
extern double balans = 500;
extern int Magic_usd = 11111;
extern int Magic_gbp = 22222;
extern int Magic_jpy = 33333;
extern bool show_indi = true;
extern int Slippege = 5;

double lotsx;
int ticket,Magic=123,Gl_fontsize_544 = 14;
string Gls_104 = "Kuklovod_v_1.0.";

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits == 3 || Digits == 5)
{
Slippege *= 10;

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

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

if(show_indi == true )
{
indi();//функция индикации в окно инструмента.
//indi_2();
}
else show_indi = false;

if(lots == true)
lotsx=Lots; else lotsx=LotsOptimized();//Торгуем постояным лотом или ММ.
Print("Открытие сделок лотом = ",lotsx);
{
//Проверяем есть ли корзина ордеров USD:
if(OrdersTotal() > 0 && OrderMagicNumber()== Magic_usd)
return;//если есть, выходим.
{
if(OrdersTotal()== 0 && CountBuy_USD() == 0 && CountSell_USD() == 0)//если нет открытых ордеров.
{
if(USD==true)//если включена корзина USD, торгуем.
{
USD_10_30();USD_minus_10_30();closeProfit_USD();close_Loss_USD();
}
else USD=false;
}
}
//Проверяем есть ли корзина ордеров GBP:
if(OrdersTotal() > 0 && OrderMagicNumber()==Magic_gbp)
return;//если есть выходим.

if(OrdersTotal()==0 && CountBuy_GBP() == 0 && CountSell_GBP() == 0)//если нет открытых ордеров.
{
if(GBP==true)//если включена корзина GBP, торгуем.
{
GBP_10_30();GBP_minus_10_30();closeProfit_GBP();close_Loss_GBP();

}
else GBP=false;
}

//Проверяем есть ли корзина ордеров JPY:
if(OrdersTotal() > 0 && OrderMagicNumber()==Magic_jpy)
return;//если есть выходим.
{
if(OrdersTotal()== 0 && CountBuy_JPY() == 0 && CountSell_JPY() == 0)//если нет открытых ордеров.
{
if(JPY==true)//если включена корзина JPY, торгуем.
{
JPY_10_30();JPY_minus_10_30();closeProfit_JPY();close_Loss_JPY();

}
else JPY=false;
}
}
}//if(lots = true)
}//void OnTick()

//+------------------------------------------------------------------+
void close_Loss_JPY()
{
double jpy_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_JPY",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_jpy)
{
if(jpy_1 > 10 && jpy_1 {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
}

else
if(jpy_1 =-11)
{
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+
void closeProfit_JPY()
{
double jpy=iCustom(Symbol(),PERIOD_D1,"Kuklovod_JPY",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_jpy)
{
if(jpy = -70)
{
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
else
if(jpy > 60 && jpy {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+

int JPY_10_30()
{

double JPY_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_JPY",7,0);

if(JPY_1>=10 && JPY_1 {
ticket=OrderSend("AUDJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("CADJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("CHFJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("EURJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("GBPJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("NZDJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
ticket=OrderSend("USDJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина JPY: Sell",Magic_jpy,0,clrLime);
if(ticket Comment("Ошибка открытия ордера",GetLastError());
}
return(0);
}

//+------------------------------------------------------------------+
int JPY_minus_10_30()
{

double JPY_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_JPY",7,0);

if(JPY_1>=-10 && JPY_1 {
ticket=OrderSend("AUDJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("CADJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("CHFJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("EURJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("GBPJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("NZDJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
ticket=OrderSend("USDJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина JPY: Buy",Magic_jpy,0,clrLime);
if(ticket Comment("Ошибка открытия ордера",GetLastError());
}
return(0);
}
//+------------------------------------------------------------------+
int GBP_minus_10_30()
{

double GBP_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_GBP",7,0);

if(GBP_1>=-10 && GBP_1 {
ticket=OrderSend("EURGBP",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPAUD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPCAD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPCHF",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPJPY",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPNZD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPUSD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
if(ticket Comment("Ошибка открытия ордера",GetLastError());
}
return(0);
}
//+------------------------------------------------------------------+
int GBP_10_30()
{

double GBP_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_GBP",7,0);

if(GBP_1>=10 && GBP_1 {
ticket=OrderSend("EURGBP",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина GBP: Sell",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPAUD",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPCAD",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPCHF",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPNZD",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
ticket=OrderSend("GBPUSD",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
if(ticket Comment("Ошибка открытия ордера",GetLastError());
}
return(0);
}
//+------------------------------------------------------------------+
void close_Loss_GBP()
{
double gbp_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_GBP",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_gbp)
{
if(gbp_1 = -11)
{
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
else
if(gbp_1 > 10 && gbp_1 {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+
void closeProfit_GBP()
{
double gbp=iCustom(Symbol(),PERIOD_D1,"Kuklovod_GBP",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_gbp)
{
if(gbp > 60 && gbp =-60 && gbp {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
else
if(gbp = -70)
{
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+
void close_Loss_USD()//закрытие корзины USD: при показании индикатора +60, +70 или -60, -70
{
double USD_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_usd)
{
if(USD_1= -11)
{
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
else
if(USD_1 > 10 && USD_1 {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+
void closeProfit_USD()//закрытие корзины USD: при показании индикатора +60, +70 или -60, -70
{
double usd=iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);

for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()== OP_BUY && OP_SELL)
{
if(OrderMagicNumber()== Magic_usd)
{
if(usd>60 && usd {
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
else
if(usd=-70)
{
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippege,clrDeepPink);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippege,clrDeepPink);
}
}
}
}
}
}
//+------------------------------------------------------------------+

int USD_10_30()//Корзина ордеров:USD Показания индикатора +10_+30
{

double USD_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);

if(USD_1>=10 && USD_1 {
ticket=OrderSend("USDCAD",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket=OrderSend("USDCHF",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket=OrderSend("USDJPY",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket=OrderSend("EURUSD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket=OrderSend("GBPUSD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket=OrderSend("AUDUSD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket=OrderSend("NZDUSD",OP_SELL,lotsx,Bid,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
if(ticket Comment("Ошибка открытия ордера",GetLastError());
}
return(0);
}
//+------------------------------------------------------------------+
int USD_minus_10_30()//Корзина ордеров: USD Показания индикатора -10_-30
{

double USD_1=iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);

if(USD_1=-20)
{
ticket= OrderSend("USDCAD",OP_SELL,lotsx,Ask,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket= OrderSend("USDCHF",OP_SELL,lotsx,Ask,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket= OrderSend("USDJPY",OP_SELL,lotsx,Ask,Slippege,0,0,"Корзина USD: Sell",Magic_usd,0,clrLime);
ticket= OrderSend("EURUSD",OP_BUY,lotsx,Bid,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket= OrderSend("GBPUSD",OP_BUY,lotsx,Bid,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket= OrderSend("AUDUSD",OP_BUY,lotsx,Bid,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
ticket= OrderSend("NZDUSD",OP_BUY,lotsx,Bid,Slippege,0,0,"Корзина USD: Buy",Magic_usd,0,clrLime);
if(ticket Comment("Ошибка открытия ордера ",GetLastError());
}
return(0);
}
//+------------------------------------------------------------------+

double LotsOptimized() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
double lot = Lots;
int orders = OrdersHistoryTotal();
int losses = 0;
lot = NormalizeDouble(AccountFreeMargin() * MaximumRisk / balans, 2);
if (DecreaseFactor > 0.0) {
for (int i = orders - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
Print("Error in history!");
break;
}
if (OrderSymbol() != Symbol() || OrderType() > OP_SELL) continue;
if (OrderProfit() > 0.0) break;
if (OrderProfit() }
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot if(lot > maxlot) lot = maxlot;
return (lot);}
//+------------------------------------------------------------------+
int CountBuy_JPY()
{
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);
}
//+------------------------------------------------------------------+
int CountSell_JPY()
{
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_GBP()
{
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);
}
//+------------------------------------------------------------------+
int CountSell_GBP()
{
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_USD()
{
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);
}
//+------------------------------------------------------------------+
int CountSell_USD()
{
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);
}
//+------------------------------------------------------------------+
void indi()
{
string name_0 = Gls_104 + "L_1";
if (ObjectFind(name_0) == -1)
{
ObjectCreate(name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(name_0, OBJPROP_CORNER, 0);
ObjectSet(name_0, OBJPROP_XDISTANCE, 250);
ObjectSet(name_0, OBJPROP_YDISTANCE, 10);
}
ObjectSetText(name_0, "Puppet Master.", 22, "Cambria", clrYellow);
name_0 = Gls_104 ;//+ "L_2";
if (ObjectFind(name_0) == -1)
{
ObjectCreate(name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(name_0, OBJPROP_CORNER, 0);
ObjectSet(name_0, OBJPROP_XDISTANCE, 250);
ObjectSet(name_0, OBJPROP_YDISTANCE, 50);
}
ObjectSetText(name_0, " S Y S T E M. Auto_v_1.0.", 12, "Cambria", clrYellow);
name_0 = Gls_104 ;//+ "L_3";
if (ObjectFind(name_0) == -1)
{
ObjectCreate(name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(name_0, OBJPROP_CORNER, 0);
ObjectSet(name_0, OBJPROP_XDISTANCE, 500);
ObjectSet(name_0, OBJPROP_YDISTANCE, 75);
}
}//void indi()]

#14

В предыдущей версии и в этой есть еще много ошибок.


//Проверяем есть ли корзина ордеров USD:
if(OrdersTotal() > 0 && OrderMagicNumber()== Magic_usd)
return;//если есть, выходим.


Тут проверяется межик ордера, но перед вызовом OrderMagicNumber необходимо выбрать ордер с помощью OrderSelect.
Тоесть по сути это условие никогда не выполняется. Скорее всего тут нужно подставлять функцию, которая проходится по всем ордерам и проверяет есть ли хоть один ордер с меджиком Magic_usd. Меджик в такую функцию лучше передавать как параметр, чтобы можно ее использовать и для других валют.
return тут тоже не уместен, так как по сути, прерывается работа советника, и он не продолжает работу с другими валютами. Тут скоее всего вместо return уместно вызывать функции закрытия ордеров.


if(OrdersTotal()== 0 && CountBuy_USD() == 0 && CountSell_USD() == 0)//если нет открытых ордеров.


тут нужно использовать условие или (||) поскольку если общее количество ордеров равно нулю, то и количество ордеров USD тоже равно нулю. А если общее количество ордеров не равно 0, то условия дальше уже не важны.

Фунциии

closeProfit_GBP();close_Loss_GBP();

Вызываются в теле условия, которое проверяет, что нет открытых ордеров. Тоесть по сути они там ничего не закрывают, поскольку нету открытых ордеров. Лучше их перенести в условие, где есть открытые ордера, о котором я написал выше.


Для других пар аналогичные ошибки.


CountBuy_JPY
CountSell_JPY
...


у всех функций одна и та же ошибка - подсчитываются общее количество Sell или Buy ордеров. а не для конкретной валюты. Нужно добавить проверку на меджик -

if(OrderMagicNumber()== Magic_jpy)
...


В таком случае. чтобы не плодить код, лучше сделать 1 функцию, в которую передавать тип ордера и меджик, и вызывать
ее с параметрами

int CountOrdersByType(int orderType, int orderMagic)
...


Для функций

close_Loss_JPY
closeProfit_JPY
close_Loss_GBP
closeProfit_GBP
close_Loss_USD
closeProfit_USD

...

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

В функциях

GBP_10_30
GBP_minus_10_30
....


вызываются функции

ticket=OrderSend("EURGBP",OP_BUY,lotsx,Ask,Slippege,0,0,"Корзина GBP: Buy",Magic_gbp,0,clrLime);
...

но проверка на то что ордер открылся делается только у последней вызванной фунциии


if(ticket Comment("Ошибка открытия ордера",GetLastError());
}


Тут лучше открывать очерез расширенную функцию OrderSendX как в прошлой версиии, тогда код с проверкой тикета вообще не нужен - ошибку будет показывать OrderSendX.


И замечания к булевским переменным
Выражения типа

if(show_indi == true )


избыточны, так как show_indi уже булевская переменная, и если она true то условие будет выполнятся. Поэтомуя пишу так


if(show_indi)
...

Хотя в коде самой самого метатрейдера, почемуто включаются эту же проверку.

И последнее
Код

else show_indi = false;

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


Это в целом замечания по коду. Логику работы самого советника я не проверял.
Автор#15

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

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

#16


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



Нет, это обычная функция с параметрами. Как пример такой функции - я писал CountOrdersByType
В том виражении ее тоже можно использовать

if(CountOrdersByType(OP_SELL, Magic_usd) > 0)
...
#17


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



Денис, критика принимается? ;)
Смотрим кусок кода:
  if(OrderSymbol()=="USDCAD" &&
OrderSymbol()=="USDCHF" &&
OrderSymbol()=="USDJPY" &&


Объясните, разве такое может быть?
Автор#18

Сергей конечно принимается критика

if(OrderSymbol()=="USDCAD" &&
OrderSymbol()=="USDCHF" &&
OrderSymbol()=="USDJPY" &&

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

#19

Наивно сравнивать символ с константами как USDCAD и др. Может быть и USDCAD.arm и fix и другие суффиксы и префиксы.
Надо сравнивать длину названия символа > 6 и если это так, вычленять суффикс\префикс из названия.

#20


Наивно сравнивать символ с константами как USDCAD и др. Может быть и USDCAD.arm и fix и другие суффиксы и префиксы.
Надо сравнивать длину названия символа > 6 и если это так, вычленять суффикс\префикс из названия.



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


string jpyPairsSet[] = {"AUDJPY", "CADJPY", "CHFJPY", "EURJPY", "GBPJPY", "GBPJPY", "NZDJPY", "USDJPY"};
....

for(int i=0; i {
...
}
Автор#21

Сколько я пробовал с массивами у меня не чего не получилось. Не понимаю я пока, как они работают. Объяснить не кому.
Нужно string sym[7]={"USDCAD", "USDCHF", "USDJPY", "EURUSD", "GBPUSD", "AUDUSD", "NZDUSD"};
я так понимаю нужно это все перебрать в цикле,каждой паре присвоить цифровое значение.а потом передать как это все в OrderSend(); Я не понимаю зачем так замарачиваться если в OrderSend(): передается например "NZDUSD". наверное есть альтернатива функции OrderSend(); при чем сдесь надо провести торговую операцию не только на Buy но и на Sell что бы открылись все 7 ордеров по разным парам. Как все это сделать я представления не имею.Может подскажет кто,да я хоть наконец пойму как работать с массивами не только со строковыми ?

#22

Для другой подобной ЕА я просто ввел еще один массив - массив направлений. Передавал туда 1 если в томже направлении и -1 если в обратном. В функцию открытия передается Бай или Селл. Непосредственно в теле после цикла выбора пары проводил дополнительную проверку и если Поступал Сигнал Бай а В массиве направлений было -1 то при формировании запроса передавал его тип не 0, а 1 в этом же блоке проверки меняем Цену с Аск на Бид и цвет стрелочки с Синей на красную. в общем инвертировал.

Изменено 22 мая, 2014 пользователем Ttomas

Автор#23

Ребята опытные прогеры написал одну корзину ордеров, как бы законченную посмотрите кому не сильно лень.Хочу сюда добавить функцию усреднения но совершенно не панимаю как сделать это для такого советника. Пока он в таком виде.

_Kuklovod_USD.1.2_Auto..mq421 скач.

#24


Ребята опытные прогеры написал одну корзину ордеров, как бы законченную посмотрите кому не сильно лень.Хочу сюда добавить функцию усреднения но совершенно не панимаю как сделать это для такого советника.


Лучше так (имхо):

int oCount = CountTrades();
if(oCount == 0)
{
olot = Lots;
if(usd >= indi_plus && usd if(usd = indi_minus1) {Open_Minus(); Плюс = false; Минус = true;}
}
else if (oCount == Symbol_Count)
{
olot = Lots * Multipler;
//Условия на 1-ую доливку - пишите!
if (Плюс && Условия_Доливки) ....
if (Минус && Условия_Доливки) ...
}
else if (oCount == Symbol_Count * 2)
{
olot = Lots * Multipler * Multipler;
//Условия на 2-ую доливку - пишите!
if (Плюс && Условия_Доливки) ....
if (Минус && Условия_Доливки) ...
}

Это только если по всем парам работа одинаковым лотом.
Symbol_Count вычислить в OnInit()
Есть ещё мелкие замечания, но они не существенны - можно оставить на потом.

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

Автор#25

Oll я не много не понял вашу мысль. Я переписал его, но добавились 4 одинаковые функции правда с разными лотами.Как вы думаете будет это все работать ?
Конечно хотелось бы код сократить до минимума на сколько это возможно.

Спойлер

[
#include
#include
//+------------------------------------------------------------------+
//| Test KUKLOVOD.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
extern double Lots = 0.01;
extern double Multipler = 1.68;
extern int Slippage = 5;
extern double Percent_Risk = 20.0;
extern int Magic = 11111;
extern double indi_plus = 70.0;
extern double indi_plus1 = 70.5;
extern double indi_plusM1 = 80.0;
extern double indi_plusM_1 = 80.5;
extern double indi_plusM2 = 90.0;
extern double indi_plusM_2 = 90.5;
//--------------------------------+
extern double indi_minus = -70.0;
extern double indi_minus1 = -70.5;
extern double indi_minusM1 = -80.0;
extern double indi_minusM_1 = -80.5;
extern double indi_minusM2 = -90.0;
extern double indi_minusM_2 = -90.5;
extern double CloseProfitPlus = -1.0;
extern double CloseProfitMinus = 1.0;
double usd,ubitok,olots,olotsx;
int ticket,Size,size,retries,Totale;
string sy[] = {"USDCAD","USDCHF","USDJPY"};
string sym[] = {"EURUSD","GBPUSD","AUDUSD","NZDUSD"};
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 5 || Digits == 3)
{
if(Digits == 4 || Digits == 2)
{
Slippage *= 10;
}
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
usd = iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);
Totale=CountTrades();

if(Totale == 0)
{
if(usd >= indi_plus && usd {
Open_Plus();
}
else
if(Totale > 0)
{
if(usd >= indi_plusM1 && usd {
Open_Plus_d();
}
else
if(Totale > 0)
{
if(usd >= indi_plusM2 && usd {
Open_Plus_d2();
}
}
}
}
if(Totale == 0)
{
if(usd = indi_minus1)
{
Open_Minus();
}
else
if(Totale > 0)
{
if(usd = indi_minusM_1)
{
Open_Minus_d();
}
else
if(Totale > 0)
{
if(usd = indi_minusM_2)
{
Open_Minus_d2();
}
}
}
}
if(usd {
Close_Profit(OP_BUY);
}
if(usd >= CloseProfitMinus)
{
Close_Profit(OP_BUY);
}
ubitok = NormalizeDouble(OrderProfit() - AccountBalance() * Percent_Risk / 100,2);
if(ubitok && OrderProfit() {
Close_losse(OP_BUY);
}
//---
}
//--------------Функция закрытия убытка от баланса-----------------------+
void Close_losse(int otypex)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
{
if(OrderType() == otypex)
{
if(OrderType() == OP_BUY && OrderType() == OP_SELL)
{
if(OrderType() == OP_BUY ) if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue)) Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
if(OrderType() == OP_SELL) if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrBlue)) Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
}
}
}
}
}
}
//------------------Функция закрытия профита---------------------------+
void Close_Profit(int otype)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
{
if(OrderType() == otype)
{
if(OrderType() == OP_BUY && OrderType() == OP_SELL)
{
if(OrderType() == OP_BUY ) if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue))Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
if(OrderType() == OP_SELL) if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrBlue))Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
}
}
}
}
}
}

//-------------------Функция первая доливка ордеров-------------------+
void Open_Minus_d2()
{
Size = ArraySize(sym);
size = ArraySize(sy);
olotsx=NormalizeDouble(olots*Multipler,2);
for(int c=Size-1; c >=0; c--)
{
OrderSendReliable(sym[c],OP_SELL,olotsx,Bid,Slippage,0,0,"Кукловод -70",Magic,0,clrRed);
}
for(int e=size-1; e>=0; e--)
{
OrderSendReliable(sy[e],OP_BUY,olotsx,Ask,Slippage,0,0,"Кукловод -70",Magic,0,clrGreen);
}
}
//-------------------Функция первая доливка ордеров-------------------+
void Open_Minus_d()
{
Size = ArraySize(sym);
size = ArraySize(sy);
olots=NormalizeDouble(Lots*Multipler,2);
for(int c=Size-1; c >=0; c--)
{
OrderSendReliable(sym[c],OP_SELL,olots,Bid,Slippage,0,0,"Кукловод -70",Magic,0,clrRed);
}
for(int e=size-1; e>=0; e--)
{
OrderSendReliable(sy[e],OP_BUY,olots,Ask,Slippage,0,0,"Кукловод -70",Magic,0,clrGreen);
}
}
//---------------Функция второй доливки ордеров-----------------+
void Open_Plus_d2()
{
Size = ArraySize(sym);
size = ArraySize(sy);
olotsx=NormalizeDouble(olots*Multipler,2);

for(int a=Size-1; a >=0; a--)
{
OrderSendReliable(sym[a],OP_BUY,olotsx,Ask,Slippage,0,0,"Кукловод +70",Magic,0,clrGreen);
}
for(int b=size-1; b>=0; b--)
{
OrderSendReliable(sy,OP_SELL,olotsx,Bid,Slippage,0,0,"Кукловод +70",Magic,0,clrRed);
}
}


//---------------Функция первой доливки ордеров-----------------+
void Open_Plus_d()
{
Size = ArraySize(sym);
size = ArraySize(sy);
olots=NormalizeDouble(Lots*Multipler,2);

for(int a=Size-1; a >=0; a--)
{
OrderSendReliable(sym[a],OP_BUY,olots,Ask,Slippage,0,0,"Кукловод +70",Magic,0,clrGreen);
}
for(int b=size-1; b>=0; b--)
{
OrderSendReliable(sy,OP_SELL,olots,Bid,Slippage,0,0,"Кукловод +70",Magic,0,clrRed);
}
}


//-------------------Функция открытия ордеров-------------------+
void Open_Minus()
{
Size = ArraySize(sym);
size = ArraySize(sy);

for(int c=Size-1; c >=0; c--)
{
OrderSendReliable(sym[c],OP_SELL,Lots,Bid,Slippage,0,0,"Кукловод -70",Magic,0,clrRed);
}
for(int e=size-1; e>=0; e--)
{
OrderSendReliable(sy[e],OP_BUY,Lots,Ask,Slippage,0,0,"Кукловод -70",Magic,0,clrGreen);
}
}

//+------------------Функция открытия ордеров--------------------+
void Open_Plus()
{
Size = ArraySize(sym);
size = ArraySize(sy);

for(int a=Size-1; a >=0; a--)
{
OrderSendReliable(sym[a],OP_BUY,Lots,Ask,Slippage,0,0,"Кукловод +70",Magic,0,clrGreen);
}
for(int b=size-1; b>=0; b--)
{
OrderSendReliable(sy,OP_SELL,Lots,Bid,Slippage,0,0,"Кукловод +70",Magic,0,clrRed);
}
}

//+---------------Функция перебора ордеров с праверкой на магик------+
int CountTrades()
{
int count = 0;
for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
count++;
}
}
return(count);
}
//----------------Функция оброботки ошибок---------------------------+
int OrderSendReliable(string asymbol, int cmd, double volume, double aprice,
int slippage, double stoploss, double takeprofit,
string acomment, int magic, datetime expiration = 0,
color arrow_color = CLR_NONE)
{
int err = GetLastError();
err = 0;
bool exit_loop = false;
bool limit_to_market = false;

err = GetLastError();
err = 0;
ticket = -1;

if ((cmd == OP_BUY) || (cmd == OP_SELL))
{
int cnt = 0;
while (!exit_loop)
{
if (IsTradeAllowed())
{
ticket = OrderSend(asymbol, cmd, volume, aprice, slippage,
stoploss, takeprofit, acomment, magic,
expiration, arrow_color);
err = GetLastError();
}
else
{
cnt++;
}
switch (err)
{
case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_INVALID_PRICE:
case ERR_OFF_QUOTES:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;

case ERR_PRICE_CHANGED:
case ERR_REQUOTE:
RefreshRates();
continue;

default:
exit_loop = true;
break;

} // end switch

if (cnt > retries)
exit_loop = true;

if (!exit_loop)
{
Sleep(1000);
RefreshRates();
}

if (exit_loop)
{
if (err != ERR_NO_ERROR)
{
Alert("Ошибка : " + IntegerToString(err));
}
}
}

if (err == ERR_NO_ERROR)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
return(ticket);
}
Alert("Ошибка открытия ордера после " + IntegerToString(cnt) + " попыток.");
Alert("Ошибка : " + IntegerToString(err));
return(-1);
}
return(-1);
}
//+------------------------------------------------------------------+




]

Страница 1 из 2

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

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