- (45 Страниц)
-
- 1
- 2
- 3
- →
- Последняя »
Общие вопросы.
#1
Отправлено 04 июля 2008 - 00:24
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#2
Отправлено 13 июля 2008 - 22:43
#3
Отправлено 14 июля 2008 - 00:52
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#5
Отправлено 16 июля 2008 - 07:53
Начинание Кирилла ближе к практике - это значит, ближе к трейдеру, стремящемуся претворить возникающие идеи в материальную оболочку адвизора и индюка.
Пару лет назад мне даже не приходила в голову мысль о написании или редактировании последних, но на пройденном пути вставали один за другим вопросы, прямо или косвенно толкающие на знакомство со структурой кода и коррекцией, изменением его для приспособления к собственным нуждам. К примеру, купив новую машину, я приспосабливаю под себя положение сиденья - выше или ниже, дальше или ближе, его наклон, высоту руля, силу подсветки приборов, настраиваю нужные станции в приемнике, одеваю чехлы на сиденья по вкусу и т.п. Так и с экспертами, - каждый должен соответствовать именно МОИМ потребностям, отвечать именно МОИМ требованиям. А для этого так или иначе надо понимать суть и структуру его кода, что приводит к НЕОБХОДИМОСТИ изучения языка MQL.
Последний пример: мне нужен был индикатор канала, соответствующий моей ТС. У Антонова уже был готовый подобный индикатор, но он не устроил меня по той простой причине, что работал только на Н1, вто время, как мне надо было соответствие индикатора таймфрейму Н4 и Д1. Вот и пришлось делать свой индикатор, поскольку готовых с такими параметрами не нашлось.
В результате появилось даже ТРИ индикатора - канальный по-Антонову, Туннель+канал и МА_канал. Каждый из них имеет свои особенности, но цель я достиг с последним - kanal_Ant, который висит двумя постами выше.
Так что, коллеги, желаю Вам не закрывать глаза на школу Кирилла, а серьезно и вдумчиво, не жалея времени, изучать язык и методику, предложенную автором. Пригодится, если Вы хотите чего-то добиться на Форексе. Если хотите стать успешными трейдерами.
#6
Отправлено 16 октября 2008 - 11:19
#9
Отправлено 16 октября 2008 - 21:40
vit_str (16.10.2008, 11:19) писал:
Используйте функцию OrderDelete() в комбинации с функцией:
/*
Принимает тикет ордра.
Возвращает:
-1 - если ордер уже закрыт или удалён
1 - если ордер открыт
0 - если ордер всё ещё является отложенным
*/
int CheckPending(int ticket)
{
OrderSelect(ticket, SELECT_BY_TICKET);
if(OrderCloseTime()!=0)
return(-1);
else if(OrderType() == OP_BUY || OrderType() == OP_SELL)
return(1);
else
return(0);
}
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#10
Отправлено 27 октября 2008 - 02:41
В общем вот код севетника, тут с трейлингом какаят заморочька вроде все компилируется без проблем, даже на тестере работает а в реале нехочит тралами денюшку пожимать))))
И еще ему как нибуть запретить бы модифицирование чужих ордеров по томуже инструменту, ато другой советник открывает отложеные ордера а он их берет и модифицирует а то и вообще вазмет да удалит.....
//+------------------------------------------------------------------+
//| MakeGrid.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005,"
#property link "http://www.www.net/"
//#property version "1.6beta"
// modified by cori. Using OrderMagicNumber to identify the trades of the grid
extern int uniqueGridMagic = 11111; // Magic number of the trades. must be unique to identify
// the trades of one grid
extern double Lots = 0.1; //
extern double TrailingStop = 40; //
extern double GridSize = 1; // pips between orders - grid or mesh size
extern double GridSteps = 1; // total number of orders to place
extern double TakeProfit = 12; // number of ticks to take profit. normally is = grid size but u can override
extern double StopLoss = 10; // if u want to add a stop loss. normal grids dont use stop losses
extern double UpdateInterval = 1; // update orders every x minutes
extern bool wantLongs = true; // do we want long positions
extern bool wantShorts = false; // do we want short positions
extern bool wantBreakout = true; // do we want longs above price, shorts below price
extern bool wantCounter = true; // do we want longs below price, shorts above price
extern bool limitEMA34 = true; // do we want longs above ema only, shorts below ema only
extern bool limitEMA100 = true; // do we want longs above ema only, shorts below ema only
extern bool limitEMA200 = true; // do we want longs above ema only, shorts below ema only
extern double GridMaxOpen = 0; // maximum number of open positions : not yet implemented..
extern bool UseMACD = true; // if true, will use macd >0 for longs only, macd >0 for shorts only
// on crossover, will cancel all pending orders. This will override any
// wantLongs and wantShort settings - at least for now.
extern bool CloseOpenPositions = false;// if UseMACD, do we also close open positions with a loss?
// modified by cori. internal variables only
string GridName = "Grid"; // identifies the grid. allows for several co-existing grids
double LastUpdate = 0; // counter used to note time of last update
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
#property show_inputs // shows the parameters - thanks Slawa...
if ( TakeProfit <= 0 ) //
{ TakeProfit = GridSize; }
//----
// added my corri and removed by !! lol.. just to stay compatible with open grids...
// GridName = StringConcatenate( "Grid", Symbol() );
return(0);
}
//+------------------------------------------------------------------------+
//| tests if there is an open position or order in the region of atRate|
//| will check for longs if checkLongs is true, else will check|
//| for shorts |
//+------------------------------------------------------------------------+
bool IsPosition(double atRate, double inRange, bool checkLongs )
{
int totalorders = OrdersTotal();
for(int j=0;j<totalorders;j++) // scan all orders and positions...
{
OrderSelect(j, SELECT_BY_POS);
// modified by cori. Using OrderMagicNumber to identify the trades of the grid // hdb added or gridname for compatibility
if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // only look if mygrid and symbol...
{ int type = OrderType();
if (MathAbs( OrderOpenPrice() - atRate ) < (inRange*0.9)) // dont look for exact price but price proximity (less than gridsize)
{ if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
{
return(true);
}
}
}
}
return(false);
}
//+------------------------------------------------------------------------+
//| cancells all pending orders |
//+------------------------------------------------------------------------+
void CloseAllPendingOrders( )
{
int totalorders = OrdersTotal();
for(int j=totalorders-1;j>=0;j--) // scan all orders and positions...
{
OrderSelect(j, SELECT_BY_POS);
// modified as per cori. Using OrderMagicNumber to identify the trades of the grid // hdb added or gridname for compatibility
if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // only look if mygrid and symbol...
{
int type = OrderType();
bool result = false;
switch(type)
{
case OP_BUY : result = true;
case OP_SELL : result = true;
//Close pending orders
case OP_BUYLIMIT : result = OrderDelete( OrderTicket() );
case OP_BUYSTOP : result = OrderDelete( OrderTicket() );
case OP_SELLLIMIT : result = OrderDelete( OrderTicket() );
case OP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
}
}
return;
}
//+------------------------------------------------------------------------+
//| cancells all pending orders and closes open positions |
//+------------------------------------------------------------------------+
void CloseOpenOrders()
{
int total = OrdersTotal();
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
bool result = false;
// modified by cori. Using OrderMagicNumber to identify the trades of the grid // hdb added or gridname for compatibility
if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // only look if mygrid and symbol...
{
// Print("Closing 2 ",type);
switch(type)
{
//Close opened long positions
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
break;
//Close pending orders
case OP_BUYLIMIT :
case OP_BUYSTOP :
case OP_SELLLIMIT :
case OP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
}
if(result == false)
{
// Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
// Sleep(3000);
}
}
return;
}
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
int i, j,k, ticket, entermode, totalorders;
bool doit;
double point, startrate, traderate;
//----
if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // we update the first time it is called and every UpdateInterval minutes
{
LastUpdate = CurTime();
point = MarketInfo(Symbol(),MODE_POINT);
startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // round to a number of ticks divisible by GridSize
k = startrate;
k = k * GridSize;
startrate = k * point - GridSize*GridSteps/2*point; // calculate the lowest entry point
double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
double EMA100=iMA(NULL,0,100,0,MODE_EMA,PRICE_CLOSE,0);
double EMA200=iMA(NULL,0,200,0,MODE_EMA,PRICE_CLOSE,0);
if ( UseMACD ) {
double Macd0=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
double Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
if( Macd0>0 && Macd1>0 && Macd2<0) // cross up
{
CloseAllPendingOrders();
if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
}
if( Macd0<0 && Macd1<0 && Macd2>0) // cross down
{
CloseAllPendingOrders();
if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
}
wantLongs = false;
wantShorts = false;
if( Macd0>0 && Macd1>0 && Macd2>0) // is well above zero
{
wantLongs = true;
}
if( Macd0<0 && Macd1<0 && Macd2<0) // is well below zero
{
wantShorts = true;
}
}
for( i=0;i<GridSteps;i++)
{
traderate = startrate + i*point*GridSize;
if ( wantLongs && (!limitEMA200 || traderate > EMA200) && (!limitEMA34 || traderate > EMA34) && (!limitEMA100 || traderate > EMA100))
{
if ( IsPosition(traderate,point*GridSize,true) == false ) // test if i have no open orders close to my price: if so, put one on
{
double myStopLoss = 0;
if ( StopLoss > 0 )
{ myStopLoss = traderate-point*StopLoss; }
if ( traderate > Ask )
{ entermode = OP_BUYSTOP; }
else
{ entermode = OP_BUYLIMIT; }
if ( ((traderate > Ask ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) )
{
// modified by cori. Using OrderMagicNumber to identify the trades of the grid
ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*
TakeProfit,GridName,uniqueGridMagic,0,Green);
}
}
}
if ( wantShorts && (!limitEMA200 || traderate < EMA200) && (!limitEMA34 || traderate < EMA34) && (!limitEMA100 || traderate < EMA100))
{
if (IsPosition(traderate,point*GridSize,false)== false ) // test if i have no open orders close to my price: if so, put one on
{
myStopLoss = 0;
if ( StopLoss > 0 )
{ myStopLoss = traderate+point*StopLoss; }
if ( traderate > Bid )
{ entermode = OP_SELLLIMIT; }
else
{ entermode = OP_SELLSTOP; }
if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) )
{
// modified by cori. Using OrderMagicNumber to identify the trades of the grid
ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red);
}
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
#11
Отправлено 27 октября 2008 - 03:29
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#12
Отправлено 05 ноября 2008 - 22:59
интерисует меня, как оговаривается период скользящих. например, что-бы робот использовал скользящие 15мин графика.
при этом сравнивал направение с дневными скользящими и сравнивал показатели 15мин стохастика.
открытие сделки только, когда все индикаторы показывают одиннаковое направление - т.е. это надо написать по отдельности каждый индикатор, а потом слить их в один код? как можно такое описать?
#13
Отправлено 05 ноября 2008 - 23:21
Нет, вовсе не нужно сливать эти индикаторы в один код. Из кода советника можно вызывать готовые индикаторы по ходу его работы.
Для встроенных в терминал индикаторов есть свои специальные ф-ии. Например, для MA используйте функцию iMA(), для Bollindger Bands - функцию iBands(), и т.д.
Для определения значения пользовательских индикаторов обратитесь к ф-ии iCustom().
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#14
Отправлено 06 ноября 2008 - 13:41
я взял ваш примерочный советник из урока 13, из темы курс MQL
нужно пересечение цены со скользящей. как цену обозначить, не нашёл, поэтому просто заменил значение периода скользящей на "1"
итак две скользящие - 1 и 8
это я понимаю один блок
второй блок - пресечение скользящих 1&8 реализовать только из их относительного положения к более длинной скользящей(выше, ниже), это как я понимаю, называется фильтр?
третий блок - сигнал стохастика
чётвёртый блок - тенденция на 4H или на D1
всё это нужно слить в один код, положительный ответ по всем пунктам - открытие позиции. какой функцией такое проделывается?
ещё, подскажите, как время устанавливать, т.е. работа с инидкаторами именно на определённом периоде? в вашем примере, смотрел код, но так и не понял на каком периоде они работают
#15
Отправлено 06 ноября 2008 - 17:14
ArNick (6.11.2008, 12:41) писал:
В этом и заключается Ваша задача как программиста. У Вас есть вся функциональность языка MQL4, какие алгоритм и реализацию Вы придумаете зависит только от Вас.
ArNick (6.11.2008, 12:41) писал:
А Вы описание функций смотрели?
double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Третий параметр - период графика.
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#16
Отправлено 11 ноября 2008 - 20:39
Что-то не заходит народ на эту ветку,но я надеюсь что вы услышите меня и
поможете разобраться в проблеме.Я новичок, пытаюсь написать советник,но
у меня не получается с модификацией открытой позиции.
По условию системы,если цена поднялась в профит на 10 пунктов (при Buy)
от цены открытия,то мне надо передвинуть стоп на 2 пункта в профит .
Я делаю так.Это кусок кода:
// Модификация ордеров
if(Volume[0]>1) return;
while(true) // Цикл закрытия орд.
{
if (Tip==0 && Mod1_B==true ) // Открыт ордер Buy..
{ //и есть критерий первой модификации
Alert("Попытка первой модификации Buy ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=Bu1(OrderTicket());// Первая модификация Buy
if (Ans==true) // Получилось
{
Alert ("Модифицирован №1 ордер Buy ",Ticket);
break; // Выход из цикла первой модификации
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return;
}
if (Tip==1 && Mod1_B==true ) // Открыт ордер Sell..
{ //и есть критерий первой модификации
Alert("Попытка первой модификации Sell ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=Bu1(OrderTicket());// Первая модификация Sell
if (Ans==true) // Получилось
{
Alert ("Модифицирован №1 ордер Sell ",Ticket);
break; // Выход из цикла первой модификации
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//-------------------------------------------------------------------+
// функция переводит СЛ в бу или на нужный уровень +
//+------------------------------------------------------------------+
int Bu1(int ti=0)
{
int err;double sl;
if(ti==0){return(-1);}
if(OrderSelect(ti,SELECT_BY_TICKET,MODE_TRADES)&&(OrderCloseTime()==0)){
if(ModSL1==0){sl=OrderOpenPrice();}else{
if(OrderType()==OP_BUY) {sl=NormalizeDouble((OrderOpenPrice()+ModSL1*Point),Digits);}
if(OrderType()==OP_SELL){sl=NormalizeDouble((OrderOpenPrice()-ModSL1*Point),Digits);}}
if(OrderType()==OP_BUY){
if(sl<MarketInfo(OrderSymbol(),MODE_BID)-(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){
err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);}}
if(OrderType()==OP_SELL){
if(sl>MarketInfo(OrderSymbol(),MODE_ASK)+(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*
Point)&&sl!=OrderStopLoss()){
err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);}}}
return(err);
}
Функцию Bu1 Игоря Кима,я взял в советнике 16_ZigAndZag_trade_V2. ModSL1=2-уровень переноса стопа.
При компиляции возникает ошибка 0 (нет ошибки) и стоп,то перенесён на 2 пункта,то нет.
Объясните пожалуйста,что я неправильно делаю и как надо.
#17
Отправлено 11 ноября 2008 - 21:00
Я думаю ошибка в том, что Вы перед использованием ф-ии OrderTicket(); Ans=Bu1(OrderTicket());// Первая модификация Buy не вызываете ф-ю OrderSelect();
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
#19
Отправлено 17 ноября 2008 - 20:09
С модификацией открытых позиций,я где-то не догоняю.
У меня возник такой вопрос.Если из 100 позиций назначенных
к модификации,модифицируется 94,это нормально или нет?
Или должна быть 100% модификация?Оставшиеся 6 позиций
должны были модифицироваться, это явно видно,но этого не
произошло.Ошибок после компиляции нет.
Ответьте пожалуйста.
#20
Отправлено 17 ноября 2008 - 23:57
StockProgrammer@mail.ru
Виртуальный сервер (VPS) для автоматической торговли.
Поделиться темой:
- (45 Страниц)
-
- 1
- 2
- 3
- →
- Последняя »
| Trackback URL | Trackback Date | Total Hits |
|---|---|---|
| Название темы | Автор | Статистика | Последнее сообщение | |
|---|---|---|---|---|
![]() |
Мы ответим на все Ваши вопросы!
Мы ответим на все Ваши вопросы! |
wwww ![]() |
|
|
![]() |
Вот решил создать , ЧАТ , где трейдеры могут обсуждать все свои вопросы ....
|
samdex ![]() |
|
|
![]() |
|
Kirill ![]() |
|
|
![]() |
|
DeBug ![]() |
|
|
![]() |
Вопросы по советникам | bastet ![]() |
|
|

Вход
Регистрация
Помощь























