import MetaTrader5 as mt5 import pandas as pd from datetime import datetime #initialisation mt5.initialize () #login to trade account login = number password = "" server = "server" mt5.login(login, password, server) price = mt5.symbol_info_tick("GOLDmicro").ask #get account info account_info = mt5.account_info() print(account_info) #getting specific account data login_number = account_info.login balance = account_info.balance equity = account_info.equity print() print("login: ", login_number) print("balance: ", balance) print("equity: ", equity) #send order to the market price = mt5.symbol_info_tick("GOLDmicro").ask point = mt5.symbol_info("GOLDmicro").point request = { "action": mt5.TRADE_ACTION_DEAL, "symbol" : "GOLDmicro", "volume" : 0.1, "type" : mt5.ORDER_TYPE_BUY, "price" : price, "SL" : 0.0, "TP": 0.0, "deviation" : 200, "magic" : 123456, "comment" : "TEST", "type_time" : mt5.ORDER_TIME_GTC, "type_filling" : mt5.ORDER_FILLING_IOC, } order = mt5.order_send(request) print(order) #Test for position from_date=datetime(2022,1,1) to_date=datetime.now() history_orders=mt5.history_orders_get(from_date, to_date, group="*GOLD*") if history_orders==None: print("code d'erreur={}".format(mt5.last_error())) elif len(history_orders)>0: print("history_orders_get({}, {}, group=\"*GOLD*\")={}".format(from_date,to_date,len(history_orders))) print()
To modify a POSITION you need:
1. Go through all positions
1.1. Select position and only then modify.
How it looks like in pure MQL5:
//+------------------------------------------------------------------+ //| Trailing | //| InpTrailingStop: min distance from price to Stop Loss | //+------------------------------------------------------------------+ void Trailing() { if(InpTrailingStop==0) // Trailing Stop, min distance from price to SL ('0' -> OFF) return; double freeze=0.0,stops=0.0; FreezeStopsLevels(freeze,stops); double max_levels=(freeze>stops)?freeze:stops; /* SYMBOL_TRADE_STOPS_LEVEL determines the number of points for minimum indentation of the StopLoss and TakeProfit levels from the current closing price of the open position ------------------------------------------------|------------------------------------------ Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|------------------------------------------ TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL ------------------------------------------------------------------------------------------ SYMBOL_TRADE_FREEZE_LEVEL shows the distance of freezing the trade operations for pending orders and open positions in points ------------------------|--------------------|-------------------------------------------- Type of order/position | Activation price | Check ------------------------|--------------------|-------------------------------------------- Buy Limit order | Ask | Ask-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy Stop order | Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Sell Limit order | Bid | OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL Sell Stop order | Bid | Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy position | Bid | TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL | | Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL Sell position | Ask | Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL | | StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL ------------------------------------------------------------------------------------------ */ for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic) { double price_current = m_position.PriceCurrent(); double price_open = m_position.PriceOpen(); double stop_loss = m_position.StopLoss(); double take_profit = m_position.TakeProfit(); double ask = m_symbol.Ask(); double bid = m_symbol.Bid(); //--- if(m_position.PositionType()==POSITION_TYPE_BUY) { if(price_current-price_open>=m_trailing_stop+m_trailing_step) if(price_current-m_trailing_stop>=price_open+m_trailing_activate) if(stop_loss<price_current-(m_trailing_stop+m_trailing_step)) if(m_trailing_stop>=max_levels && (take_profit-bid>=max_levels || take_profit==0.0)) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(price_current-m_trailing_stop), take_profit)) if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","Modify BUY ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); if(InpPrintLog) { RefreshRates(); m_position.SelectByIndex(i); PrintResultModify(m_trade,m_symbol,m_position); } continue; } } else { if(price_open-price_current>=m_trailing_stop+m_trailing_step) if(price_current+m_trailing_stop<=price_open-m_trailing_activate) if((stop_loss>(price_current+(m_trailing_stop+m_trailing_step))) || (stop_loss==0)) if(m_trailing_stop>=max_levels && ask-take_profit>=max_levels) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(price_current+m_trailing_stop), take_profit)) if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","Modify SELL ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); if(InpPrintLog) { RefreshRates(); m_position.SelectByIndex(i); PrintResultModify(m_trade,m_symbol,m_position); } } } } }
Thank you for your answer,
The problem is, as I explained in the post, that I can't see my open orders in history. It shows me nothing and I don't understand why...
If I understand well, the steps are:
- Open order
- Then, check history orders
- Select the open order
- Modify TP
I'm beginner in Python so if someone got some part of code to make this I will be very grateful :)
Thank you for your answer,
The problem is, as I explained in the post, that I can't see my open orders in history. It shows me nothing and I don't understand why...
If I understand well, the steps are:
- Open order
- Then, check history orders
- Select the open order
- Modify TP
I'm beginner in Python so if someone got some part of code to make this I will be very grateful :)
If you are new to Python, why are you trying to get into this language? Learn MQL5 - MQL5 is the native language of the MetaTrader 5 terminal!
Because Python is way easier (in my opinion) to learn than MQL5 language.
I tried both and I'm more confident on Python.
BTW I find my open order:
# Obtain open order on GOLD positions=mt5.positions_get(symbol="GOLDmicro") if positions==None: print("Aucune position sur GOLD, code d'erreur={}".format(mt5.last_error())) elif len(positions)>0: print("Total des positions sur GOLD =",len(positions)) # affiche toutes les positions ouvertes for position in positions: print(position)
But I don't understand the request to modify the Take Profit:
I tried something like this but doesn't work... Is there an issue with the structure of the SLTP request or the problem is not the structure but other thing?
Tradeposition = 541048957 position=mt5.positions_get(symbol="GOLDmicro")[-1].ticket point = mt5.symbol_info("GOLDmicro").point tick = mt5.symbol_info_tick("GOLDmicro") sltp_request = { "action": mt5.TRADE_ACTION_SLTP, "symbol": "GOLDmicro", "volume": 0.1, "type": mt5.ORDER_TYPE_SELL, "position": Tradeposition, "tp": 0.0, "price": mt5.symbol_info_tick("GOLDmicro").ask, "magic": 234000, "comment": "Change TP", "type_time": mt5.ORDER_TIME_GTC, "type_filling": mt5.ORDER_FILLING_IOC, }
You don't know MQL5 and you don't know Python.
What you don't realize is that to work with Python, you must first learn MQL5 - since MQL5 is the native language for the MetaTrader 5 trading terminal! This leads to a logical conclusion: You must learn MQL5. And only when you become a professional, you will probably learn Python.
I disagree ..
you can learn one and the other, simultaneously...im doing it as well..
there are limitations, but those are only set by yourself....
dont let anyone tell you " you know nothing"...rather dont give any advice Vlad,
to Draz.. keep on going, dont let anyone dissuade you, especially these so called 'experts'
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I am stuck right now on my script.
I can open an order (see first picture attached) but i can not define a Take profit.
I tried with a number (like 2000 for exemple), I tried with a variable etc. Everytime my order is opened but the TP is 0.0
So, I tried to open my trade and to modify the TP after that with a "mt5.TRADE_ACTION_SLTP" but I need to retrieve the order number (for exemple in my 2nd picture attached "540960570") but I don't really know how to do it...
I tried "History_orders_get" ; "history_orders_total" ; "positions_get" etc. but it always return that I don't have any open position (that's wrong I have an open position and several closed positions which could have been found).
And last thing I tried was to check if I had an error code and I get "code d'erreur = (-10004, 'No IPC connection')"
If someone have any idea I would be really happy :) thank you