Ya bazı modlar desteklenmiyorsa? Neden aniden ticaret yapmaktan vazgeçesiniz?
Özellikle "Sipariş vermede Stop Limit modunu desteklemiyorsa"? Bu, ticaret yapmayı imkansız kılan inanılmaz bir talihsizliktir.
© BAŞLARDA YIKIM
En başında şöyle diyor:
ÖNEMLİ: Konuyu "uzatmamak" için herhangi bir yorum varsa,
veya sorularınız varsa - bu bölümde ayrı bir konu oluşturun (burada cevaplamayacağım).
P / S Özellikle "yetenekli" için:
Bu fonksiyonda, şu parametreleri kontrol etmek gereklidir:
Danışmanınızda kullanacaksınız. İşte bir örnek:
......................
Devam:
Sık kullanılan ve kullanışlı özellikler:
CheckError() işlevinin kendisi ( örnekteki tüm dönüş kodları değil )
................................................ . ......................
Dönüş kodlarının açıklaması:
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 ); }
Tavsiye :
FORTS için Expert Advisors tasarlarken Tick olayını kullanmanızı önermem ancak
BookEvent olayını kullanmak daha iyidir
Örnekler:
Bir bardak eklemek:
(YALNIZCA OnInit() içinde kullanın)
if ( ! MarketBookAdd ( _Symbol ) ) { MessageBox ( "Не добавлен стакан фьючерса " + _Symbol + "!" , "Ошибка" , MB_OK | MB_ICONHAND ); return ( INIT_FAILED ); }
Bir cam aboneliğini silme:
void OnDeinit ( const int reason ) { MarketBookRelease ( _Symbol ); }
Depth of Market'ten en iyi ASK ve BID'yi ve hacimlerini almak:
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 ); }
İşlev çağrısı:
if ( a_symbol == _Symbol ) kontrolü ZORUNLUDUR, değişenin Pazar Derinliğiniz olduğunu garanti eder.
//+------------------------------------------------------------------+ //| 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 } } }
TEŞEKKÜR EDERİM!!!)
özellikler:
Etkisiz ve hatalı için hesaplama formülleri ve puanlama
ek işlemleri.
P/S Genellikle kurallar ve puanlar değişir :(
Sık kullanılan ve kullanışlı özellikler:
SetStDayTime() işlevi, işlem gününün başlangıç saatini (istek anında) döndürür.
GetExgangeFee() işlevi, değişim komisyonunu ve işlem günü başına işlem sayısını (istek anında) döndürür:
//+------------------------------------------------------------------+ //| 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 ); }
Sık kullanılan ve kullanışlı özellikler:
SetStDayTime() işlevi, işlem gününün başlangıç saatini (istek anında) döndürür.
GetExgangeFee() işlevi, değişim komisyonunu ve işlem günü başına işlem sayısını (istek anında) döndürür:
Eh, "Hindu Coder - 2015" unvanı için eşi görülmemiş bir yarışmacı.
SetStDayTime() iki satırla çözülür. Ama tabiki gerek yok...
Michael, işlevlerin için teşekkürler!
Bazı bisikletleri icat etmem iptal edildi)
Gerçekten gerekli.
Ve nasıl?
Zamanın sayısal temsili ile çalışmak gerekir.
datetime a= TimeTradeServer ();
Gün başlama saati:
datetime r=(a/ 86400 )* 86400
Bugün saat 19:00:
datetime r=(a/ 86400 )* 86400 + 19 * 3600 ;
Bugün 19:00'daki saat mevcut saatten daha büyükse, dünün 19:00'ına ihtiyaç vardır:
if (r>a)r-= 86400 ;
Burada, hafta sonunu atlamanız gerekiyorsa , haftanın gününü kontrol edin, Pazar ise 86400 * 2 çıkarın, Cumartesi ise 86400 çıkarın (Cuma almak için).
Bunun gibi bir şey.
Ardından, gerekirse görüntülemek için bir dizeye çevirin:
TimeToStr(r)
Ve yüksek yıl?
Ve şimdi, düşüncelerinizi somut kodlara çevirin.
İşlevimi kendi yönteminle ve İKİ satırda söylediğin gibi yeniden yaz!
Artık yıl ne olacak? Her şey yoluna girecek.
Kendiniz uygulayın, kodunuzu tam olarak anlamak istemiyorum, bir şeyi kaçırırsam sevinirsiniz.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Tünaydın!
Burada FORTS vadeli işlem piyasasında öneriler, hatalar, özellikler ve sık kullanılan işlevler yayınlayacağım.
ÖNEMLİ: Konuyu "uzatmamak" için herhangi bir yorum varsa,
veya sorularınız varsa - bu bölümde ayrı bir konu oluşturun (burada cevaplamayacağım).
Tavsiye :
MQL5 standart kitaplığı FOREX piyasası için "keskinleştirilmiştir", dolayısıyla
FORTS için uzmanların gelişmeleri Her şeyi kendiniz yazmanızı tavsiye ederim.
Sık kullanılan ve kullanışlı özellikler:
Aracının sunucusunun ticaret parametrelerini kontrol etme işlevi.
Bu fonksiyonda, şu parametreleri kontrol etmek gereklidir:
Danışmanınızda kullanacaksınız. İşte bir örnek:
(YALNIZCA OnInit() içinde kullanın)
Kullanım örneği:
Enstrümanın sona ermesine kalan gün sayısını alma:
Takaslar hariç "net" pozisyon fiyatının alınması:
İşlemleri saymak için global bir terminal değişkeni oluşturma:
(YALNIZCA OnInit() içinde kullanın)
Terminalin global değişkenine korumalı yazma (işlem sayacı):
up_down parametresi true ise, terminalin global değişkenini arttırırız,
ve tersi.
Para sıkıntısı durumunda, hacmin otomatik olarak azaltılmasıyla nakit kontrolü:
OrderSend() komutu ile piyasa/limit emri verilmesi
eğer fiyat = ''0" - piyasa emri:
OrderSend() komutu ile sipariş silme
OrderSend() komutuyla bekleyen bir sipariş vermek
OrderSend() komutuyla bekleyen bir emri değiştirme
OrderSendAsync() komutuyla bekleyen bir sipariş ayarlama
Bu komutu kullanırken, bunun sonucunda bilet elde edilmez.
işlevler, ancak OnTradeTransaction() işlevinde. OrderSendAsync() işlevinde,
sipariş verme talebinin numarasını alın:
ulong order_ticket = 0;
Talep numarasına göre bilet alma:
OrderSend() ve OrderSendAsync() işlevlerinin hataları (dönüş kodları) işleme
CheckError() işlevi, sipariş gönderme uygulamasına eklenir.Örnek:
CheckError() işlevinin kendisi ( örnekteki tüm dönüş kodları değil )
Devamına bakın
özellikler:
ORDER_FILLING_IOC yürütme ile LIMIT sipariş içeren BİR'den fazla sözleşme satın alırken,
sipariş ilk cilt ile doldurulursa, geçmişteki bir sipariş ORDER_STATE_CANCELED olarak saklanabilir,
ve ikincisi başarısız oldu.
Misal:
ORDER_FILLING_IOC yürütme ile LIMIT siparişle 3 sözleşme satın almak,
aşağıdaki durum var:
1. Her üç sözleşmeyi de satın alırsak, geçmişteki sipariş durumu = ORDER_STATE_FILLED olur
2. Hiçbir şey satın almadıysak, geçmiş durumda = ORDER_STATE_CANCELED
3. İlk iki sözleşmeyi (28449) satın aldıysak, ancak 1 sözleşme (28450) almadıysak, o zaman tarihteki durum = ORDER_STATE_CANCELED
4. İlk iki sözleşmeyi (28449) satın almadıysak, ancak 1 (28450) satın aldıysak, o zaman geçmiş durumda = ORDER_STATE_PARTIAL
======= Örneğin sonu ====================
Verimsiz işlemlerin sayısı (verimsiz bir işlem, bir işleme yol açmayan bir işlemdir.
FORTS vadeli işlem piyasasında bir emrin yerleştirilmesi, değiştirilmesi ve silinmesi) tam işlem seansı başına 2000 ile sınırlıdır
geçerli günün 19-00'ından ertesi günün 18-45'ine kadar. Aşan için - Borsa para cezası
http://moex.com/n8725
Hatalar:
1. Aracının MT5 sunucusunda veya borsada bir arıza meydana gelirse, komut
sil(değiştir) MEVCUT sipariş sunucusu döndürür:
hata 10013 = TRADE_RETCODE_INVALID = Geçersiz istek ( Geçersiz istek )
2. Bazen, başarısızlık durumunda, bekleyen veya limitli bir emir vermeye çalışırken bir hata oluşur - " Enstrüman şu anda mevcut değil "
(bu bir yazım hatası değil, mesaj bu)
Belgelerde ticaret sunucusu için iade kodu yok!