¿Y qué pasa si no se apoya algún régimen? ¿Por qué iba a prohibirte comerciar?
Especialmente si "no admite el modo de configuración de órdenes Stop Limit"? Este es el problema de no poder comerciar en absoluto.
© DESTRUCCIÓN EN LA CABEZA
Está escrito al principio:
IMPORTANTE: Para no "estirar" el tema, si tienes algún comentario,
o tienes preguntas, creaun tema aparteen esta sección(no responderé aquí).
P / S para los especialmente "dotados" :
En esta función, es necesario comprobar los parámetros que
que utilizará en su EA. He aquí un ejemplo:
.......................
Continúa:
Funciones útiles y de uso frecuente:
La propia función CheckError() (no todos los códigos de retorno en el ejemplo)
.........................................................................
Explicación de los códigos de retorno:
string GetRetCode( const uint code ) { string retcode; switch( code ) { case TRADE_RETCODE_REQUOTE: retcode = "Реквота"; break; case TRADE_RETCODE_REJECT: retcode = "Запрос отвергнут"; break; case TRADE_RETCODE_CANCEL: retcode = "Запрос отменен трейдером"; break; case TRADE_RETCODE_PLACED: retcode = "Ордер размещен"; break; case TRADE_RETCODE_DONE: retcode = "Заявка выполнена"; break; case TRADE_RETCODE_DONE_PARTIAL: retcode = "Заявка выполнена частично"; break; case TRADE_RETCODE_ERROR: retcode = "Ошибка обработки запроса"; break; case TRADE_RETCODE_TIMEOUT: retcode = "Запрос отменен по истечению времени"; break; case TRADE_RETCODE_INVALID: retcode = "Неправильный запрос"; break; case TRADE_RETCODE_INVALID_VOLUME: retcode = "Неправильный объем в запросе"; break; case TRADE_RETCODE_INVALID_PRICE: retcode = "Неправильная цена в запросе"; break; case TRADE_RETCODE_INVALID_STOPS: retcode = "Неправильные стопы в запросе"; break; case TRADE_RETCODE_TRADE_DISABLED: retcode = "Торговля запрещена"; break; case TRADE_RETCODE_MARKET_CLOSED: retcode = "Рынок закрыт"; break; case TRADE_RETCODE_NO_MONEY: retcode = "Нет достаточных денежных средств для выполнения запроса"; break; case TRADE_RETCODE_PRICE_CHANGED: retcode = "Цены изменились"; break; case TRADE_RETCODE_PRICE_OFF: retcode = "Отсутствуют котировки для обработки запроса"; break; case TRADE_RETCODE_INVALID_EXPIRATION: retcode = "Неверная дата истечения ордера в запросе"; break; case TRADE_RETCODE_ORDER_CHANGED: retcode = "Состояние ордера изменилось"; break; case TRADE_RETCODE_TOO_MANY_REQUESTS: retcode = "Слишком частые запросы"; break; case TRADE_RETCODE_NO_CHANGES: retcode = "В запросе нет изменений"; break; case TRADE_RETCODE_SERVER_DISABLES_AT: retcode = "Автотрейдинг запрещен сервером"; break; case TRADE_RETCODE_CLIENT_DISABLES_AT: retcode = "Автотрейдинг запрещен клиентским терминалом"; break; case TRADE_RETCODE_LOCKED: retcode = "Запрос заблокирован для обработки"; break; case TRADE_RETCODE_FROZEN: retcode = "Ордер или позиция заморожены"; break; case TRADE_RETCODE_INVALID_FILL: retcode = "Указан неподдерживаемый тип исполнения ордера по остатку"; break; case TRADE_RETCODE_CONNECTION: retcode = "Нет соединения с торговым сервером"; break; case TRADE_RETCODE_ONLY_REAL: retcode = "Операция разрешена только для реальных счетов"; break; case TRADE_RETCODE_LIMIT_ORDERS: retcode = "Достигнут лимит на количество отложенных ордеров"; break; case TRADE_RETCODE_LIMIT_VOLUME: retcode = "Достигнут лимит на объем ордеров и позиций для данного символа"; break; case TRADE_RETCODE_INVALID_ORDER: retcode = "Неверный или запрещённый тип ордера"; break; case TRADE_RETCODE_POSITION_CLOSED: retcode = "Позиция с указанным POSITION_IDENTIFIER уже закрыта"; break; default: retcode = "Нет кода возврата."; break; } return( retcode ); }
Recomendación:
Cuando se diseñan asesores para FORTS, no recomiendo utilizar el evento Tick, sino
es mejor utilizar el evento BookEvent
Ejemplos:
Añadir una garrapata:
(Usar SOLO en OnInit() )
if ( !MarketBookAdd( _Symbol ) ) { MessageBox( "Не добавлен стакан фьючерса " + _Symbol + "!", "Ошибка", MB_OK | MB_ICONHAND ); return( INIT_FAILED ); }
Eliminación de la suscripción a un vaso:
void OnDeinit( const int reason ) { MarketBookRelease( _Symbol ); }
Obtenga los mejores ASK y BID y sus volúmenes del bombo de precios:
double sell_price, buy_price; long sell_volume, buy_volume; //+------------------------------------------------------------------+ //| Expert Get Stakan values function | //+------------------------------------------------------------------+ bool GetStakanValues( const string aSymbol, double &sell_price, double &buy_price, long &sell_volume, long &buy_volume ) { MqlBookInfo book_price[]; buy_price = 0; sell_price = DBL_MAX; buy_volume = 0; sell_volume = 0; //--- Get stakan if ( MarketBookGet( aSymbol, book_price ) )//getBook ) { int size = ArraySize( book_price ); //--- if ( size > 0 ) { double a_min_price = SymbolInfoDouble( aSymbol, SYMBOL_SESSION_PRICE_LIMIT_MIN ); double a_max_price = SymbolInfoDouble( aSymbol, SYMBOL_SESSION_PRICE_LIMIT_MAX ); //--- for( int i = 0; i < size; i++ ) { if ( book_price[i].type == BOOK_TYPE_SELL ) { if ( book_price[i].price < sell_price ) { sell_price = book_price[i].price; sell_volume = book_price[i].volume; } } else if ( book_price[i].type == BOOK_TYPE_BUY ) //First buy - exit { buy_price = book_price[i].price; buy_volume = book_price[i].volume; break; } } if ( ( buy_price <= a_max_price ) && ( buy_price >= a_min_price ) && ( sell_price <= a_max_price ) && ( sell_price >= a_min_price ) ) { if ( sell_price == DBL_MAX ) sell_price = 0; //--- if ( ( sell_price > 0 ) && ( buy_price > 0 ) ) { return( true ); } } } } //--- if ( sell_price == DBL_MAX ) sell_price = 0; //--- return( false); }
Llamada a la función:
Comprobarsi ( a_symbol == _Symbol ) es MUST, asegura que es su pila de precios la que ha cambiado.
//+------------------------------------------------------------------+ //| Expert On Book event function | //+------------------------------------------------------------------+ void OnBookEvent( const string &a_symbol ) { if ( a_symbol == _Symbol ) { if ( GetStakanValues( _Symbol, sell_price, buy_price, sell_volume, buy_volume ) ) { //you code } } }
GRACIAS!!!)
Características especiales:
Fórmulas para el cálculo y la concesión de puntos por la ineficacia y los fallos
transacciones en el anexo.
P/S Tanto las reglas como los puntos se cambian con bastante frecuencia :(
Funciones útiles y de uso frecuente:
La función SetStDayTime() devuelve la hora de inicio del día de negociación (en el momento de la solicitud).
La función GetExgangeFee() devuelve la comisión de intercambio y el número de transacciones para el día de negociación (en el momento de la solicitud):
//+------------------------------------------------------------------+ //| Tr_fee.mq5 | //| Copyright 2015, Mikalas | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Mikalas" #property link "https://www.mql5.com" #property version "1.00" // input long TrPoint = 1; //Балл за транзакцию input long DealPoint = 40; //Балл за сделку // datetime start_day_time; // //+------------------------------------------------------------------+ //| Expert Set start day time function | //+------------------------------------------------------------------+ datetime SetStDayTime() { MqlDateTime dt_str; TimeTradeServer( dt_str ); //--- if ( ( dt_str.day_of_week == 0 ) || ( dt_str.day_of_week == 6 ) ) return( datetime( 0 ) ); //--- string time_str = IntegerToString( dt_str.year ) + "." + IntegerToString( dt_str.mon ) + "." + IntegerToString( dt_str.day ) + " 19:00:00"; ulong cur_day = ulong( StringToTime( time_str ) ); if ( ( dt_str.hour >= 19 ) && ( dt_str.hour <= 23 ) ) { return( StringToTime( time_str ) ); } else { ulong one_day = 24 * 60 * 60; //--- if ( dt_str.day_of_week == 1 ) { cur_day -= one_day * 3; } else { cur_day -= one_day; } return( datetime( cur_day ) ); } return( datetime( 0 ) ); } //+------------------------------------------------------------------+ //| Expert calc deals fee function | //+------------------------------------------------------------------+ double GetExgangeFee( const datetime start_time, long& deals ) { double all_fee = 0.0; ulong deal_ticket; deals = 0; //--- if ( HistorySelect( start_time, TimeTradeServer() ) ) { int deals_total = HistoryDealsTotal(); //--- if ( deals_total > 0 ) { for ( uint i = 0; i < uint( deals_total ); i++ ) { deal_ticket = HistoryDealGetTicket( i ); //--- if ( deal_ticket > 0 ) { ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) ); if ( order_ticket > 0 ) { deals++; all_fee += HistoryDealGetDouble( deal_ticket, DEAL_COMMISSION ); } } } return( MathAbs( all_fee ) ); } } return( 0 ); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { long a_deals; start_day_time = SetStDayTime(); //--- if ( ulong( start_day_time ) == 0 ) { MessageBox( "Не установлено время начала торгового дня!", "Ошибка", MB_OK | MB_ICONHAND ); return( INIT_FAILED ); } Print( "Exgange Fee = ", GetExgangeFee( start_day_time, a_deals ), "; Deals = ", a_deals ); return( INIT_SUCCEEDED ); }
Funciones útiles y de uso frecuente:
La función SetStDayTime() devuelve la hora de inicio del día de negociación (en el momento de la solicitud).
La función GetExgangeFee() devuelve la comisión de intercambio y el número de transacciones para el día de negociación (en el momento de la solicitud):
Se trata de un aspirante sin precedentes al título de "Codificador hindú - 2015".
SetStDayTime() se resuelve con dos líneas. Pero, por supuesto, no es necesario...
Michael, ¡gracias por tus artículos!
La invención de algunas bicicletas por mí se cancela )
Tengo que hacerlo.
¿Y cómo se hace eso?
Hay que trabajar con la representación numérica del tiempo.
datetime a=TimeTradeServer();
La hora de inicio del día:
datetime r=(a/86400)*86400
La hora a las 19:00 de hoy:
datetime r=(a/86400)*86400+19*3600;
Si la hora de las 19:00 de hoy es mayor que la hora actual, entonces necesitamos las 19:00 de ayer:
if(r>a)r-=86400;
Aquí, si necesitamos saltar el fin de semana, comprobamos el día de la semana, si es domingo, restamos 86400*2, si es sábado, restamos 86400 (para obtener el viernes).
Es algo así.
A continuación, para la visualización, si es necesario, convertir a una cadena:
TimeToStr(r)
¿Y el año alto?
Ahora, traduce tus pensamientos en código concreto.
¡Reescribe mi función a tu manera, y como has dicho en DOS líneas!
¿Y el año bisiesto? Todo estará bien.
Hazlo tú mismo, no quiero entender tu código por completo, por si se me escapa algo, que placer será para ti.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
¡Buena tarde!
Aquí publicaré recomendaciones, errores, características y funciones de uso frecuente en el mercado de futuros FORTS
IMPORTANTE: Para no "estirar" el tema, si hay algún comentario,
o tiene preguntas: cree un tema separado en esta sección (no responderé aquí).
Recomendación :
La biblioteca estándar MQL5 está "afilada" para el mercado FOREX, por lo que para
desarrollos de expertos para FORTS Recomiendo escribir todo usted mismo.
Funciones útiles y de uso frecuente:
La función de verificar los parámetros comerciales del servidor del corredor.
En esta función, es necesario verificar aquellos parámetros que
Lo usarás en tu asesor. Aquí hay un ejemplo:
(usar SOLO en OnInit() )
Ejemplo de uso:
Obtener el número de días que quedan hasta el vencimiento del instrumento:
Obtener el precio de la posición "neta", excluyendo las compensaciones:
Creando una variable de terminal global para contar transacciones:
(Úselo SOLO en OnInit() )
Escritura protegida en la variable global del terminal (contador de transacciones):
Si el parámetro up_down = true, entonces aumentamos la variable global del terminal,
y viceversa.
Comprobación de fondos con reducción automática del volumen, en caso de escasez de dinero:
Colocar una orden de mercado/límite con el comando OrderSend()
si precio = ''0" - orden de mercado:
Eliminación de un pedido con el comando OrderSend()
Colocar una orden pendiente con el comando OrderSend()
Modificar una orden pendiente con el comando OrderSend()
Establecer una orden pendiente con el comando OrderSendAsync()
Al usar este comando, el ticket no se obtiene como resultado de este
funciones, pero en la función OnTradeTransaction(). En la función OrderSendAsync(),
obtenga el número de la solicitud para realizar un pedido:
ulong order_ticket = 0;Obtener un boleto por número de solicitud:
Manejo de errores (códigos de retorno) de las funciones OrderSend() y OrderSendAsync()
Se agrega la función CheckError() a la implementación del envío de pedidos.Ejemplo:
La función CheckError() en sí misma ( no todos los códigos de retorno en el ejemplo )
Ver continuación
Peculiaridades:
Al comprar más de UN contrato con una orden LIMIT con ejecución ORDER_FILLING_IOC,
un pedido en el historial se puede almacenar como ORDER_STATE_CANCELED si el pedido se completa con el primer volumen,
y el segundo fracasó.
Ejemplo:
Comprando 3 contratos con una orden LIMIT con ejecución ORDER_FILLING_IOC,
se da la siguiente situacion:
1. Si compramos los tres contratos, entonces el pedido en el historial tiene el estado = ORDER_STATE_FILLED
2. Si no compramos nada, entonces en el historial estado = ORDER_STATE_CANCELED
3. Si compramos los primeros dos contratos (28449), pero no compramos 1 contrato (28450), entonces el estado en el historial = ORDER_STATE_CANCELED
4. Si no compramos los dos primeros contratos (28449), pero compramos 1 (28450), entonces en el historial estado = ORDER_STATE_PARTIAL
======= Fin del ejemplo ===================
El número de transacciones ineficientes (una transacción ineficiente es una transacción que no condujo a una transacción.
La colocación, modificación y eliminación de una orden) en el mercado de futuros FORTS está limitada a 2000 por sesión de negociación completa
desde las 19-00 del día en curso hasta las 18-45 del día siguiente. Por exceder - una multa de la Bolsa
http://moex.com/n8725
Insectos:
1. Si ocurre una falla en el servidor MT5 del corredor o en el intercambio, entonces el comando
eliminar (modificar) el servidor de pedidos EXISTENTE devuelve:
error 10013 = TRADE_RETCODE_INVALID = Solicitud no válida (Solicitud no válida)
2. A veces, también en caso de falla, al intentar colocar una orden pendiente o límite, ocurre un error: " El instrumento no está disponible actualmente "
(eso no es un error tipográfico, ese es el mensaje)
¡No hay código de retorno para el servidor comercial en la documentación!