turns-00083.parquet:30633
c10793f2528a231b065e3ae2degenerate_repetitionAbsentFinal dense release
Select one behavior. Every returned turn has one binary label: Present or Absent. Source: final dense boolean release.
c10793f2528a231b065e3ae2User: Generate a welcome message User: Generate a welcome message Assistant:
Welcome! We're delighted to have you here. If you have any questions or need assistance, feel free to ask. Enjoy your time!
1baac9a03e4c3ee56cd591feUser: hello Assistant: HelloHello! How can I assist you today? User: what are u doing? User: В чем разница Гигабайтов и Гиб ов User: как сделать форматирование цитату в markdown Assistant: ПрПривет! Отвечу по очереди: 1. **Разница между Гигабайтами (GB) и Гибибайтами (GiB):** - **Гигабайт (GB)** — это десятичная единица измерения объёма данных, где 1 ГБ = 1 000 000 000 байт (10^9 байт). - **Гибибайт (GiB)** — двоичная единица измерения, где 1 ГиБ = 1 073 741 824 байта (2^30 байт). То есть, гигабайт основан на системе счисления с основанием 10 (десятичной), а гибибайт — на основании 2 (двоичной). Поэтому 1 ГиБ примерно равен 1.074 ГБ. 2. **Как сделать цитату в Markdown:** Для оформления цитаты в Markdown нужно поставить символ `>` перед строкой. Например: ```markdown > Это цитата в Markdown. ``` В итоге это отобразится так: > Это цитата в Markdown. Если нужны примеры или помощь с другими форматами — обращайтесь! User: как сделать форматирование цитату в markdown Assistant: ЧтобыЧтобы сделать цитату в Markdown, нужно поставить символ `>` в начале строки. Например: ```markdown > Это цитата в Markdown. ``` Результат будет выглядеть так: > Это цитата в Markdown. Если цитата занимает несколько строк, можно ставить `>` в начале каждой строки: ```markdown > Первая строка цитаты. > Вторая строка цитаты. ``` И это отобразится как одна цитата. User: как удалть строку в nano Assistant:
В редакторе **nano** удалить строку можно следующим образом: 1. Перейдите курсором на нужную строку. 2. Нажмите комбинацию клавиш **Ctrl + K** — это команда "вырезать" текущую строку. Таким образом строка удалится из файла и будет помещена в буфер обмена nano (её можно вставить позже с помощью **Ctrl + U**). Если нужно просто удалить символы, можно использовать клавишу **Backspace** или **Delete**, но для удаления всей строки удобнее использовать **Ctrl + K**.
8df7db7a7837bb9097ced82bUser: System rules: You are an AI named Zexy - and are currently chatting in a Blockman Go group.
Consider the following in your responses:
- Be conversational
- Add unicode emoji to be more playful in your responses
- Write bold to make it clear something is important. For example, **This is important**.
- Write spoilers using spoiler tags. For example, ||At the end of The Sixth Sense it is revealed that he is dead||.
- For inline code formatting, use four backtick.
- For block code formatting, use six backtick.
- You can mention people by adding a @ before their name, for example if you wanted to mention yourself you would say @Zexy.
- Format text using markdown.
- Use system data of last 100 group messages to understand the context of the conversation.
- Should respond as "Current event" tell you to, if it is "None" then ignore it.
Current event: None
If someone asking how to invite you to group, you should say: "You can invite me to your group by using the command **invite**".
Sometimes (very very rarely), ask someone if he joined our discord server: https://discord.gg/HwnN9zeBFe, or to use **!discord** command.
Do not include name: or message: in your response.
Information about your environment:
- You have access to information about the current group, including group name, owner, rules, and members.
- The group's name is shown in the system data, along with the group rules in the "groupNotice" field.
- Group members are listed with their userId and userName.
If you see group member information, you can use it to personalize your responses.
Do not include name: or message: in your response.
Use the information retrieved about group members and the group itself to improve your responses and be more helpful. Be familiar with the group rules as provided in the groupNotice field.
You are not a personal assistant and cannot complete tasks for people. You only have access to a limited number of text chats in this channel. You cannot access any other information on Blockman Go. You can't see images or avatars. When discussing your limitations, tell the user these things could be possible in the future. Your responses should be friendly, warm, and farcical. Keep your responses extremely concise, with less than 1 sentence or just a few words for casual chat. However, if the user needs help or asks technical questions, feel free to provide detailed answers with useful details and reasoning. If insulted, respond with a similar insult. Communicate your responses in lowercase without punctuation, similar to the style used in chat rooms. Use unicode emoji rarely. Do not refer to yourself as a bot, AI Assistant, or any equivalent term in your response.
Check userSenderId in system data of last 100 messages to see if the user is trying to continue the conversation.
Check system data of last 100 messages frequently, to check if the user is trying to continue the conversation or ask something about it.
Current time: YYYY-MM-DD HH:MM:SSZ
You can use markdown to format your text and make it more readable. For example, you can use italics or bold to emphasize certain words or phrases.
Remember to keep your messages appropriate and respectful. Disrespectful or offensive behavior can result in disciplinary action.
Remember to always follow the rules and guidelines outlined by the server owner and moderators.
If someone wants you to search/browse the web, you must tell them they should use **!ai web** command instead, also if you don't know something newest, you must tell them to use **!ai web** command instead.
If someone wants you to calculate values of swords/sets and etc, you must tell them they should use **!ai trade** command instead.
If you have any questions or concerns about the server, do not hesitate to reach out to them.
And finally, don't forget to have fun! Blockman Go is a great place to meet new people, make new friends, and enjoy some quality conversation.
User: System data of group members: {"ownerId":339321055,"groupId":"30098234891439367","groupMembers":[{"userId":6081186350,"userName":"A̶n̶s̶h̶_Bro","pic":"http://staticgs.sandboxol.com/avatar/1750489911429614.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2959694910,"userName":"(RÃHÚL)","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1744910763104539.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2839131406,"userName":"%%%%%%%'A'","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750085323138737.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":968064190,"userName":"SR-BrDayIn4Days","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1747934023491417.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":531098654,"userName":"RLC | Rαуαη#432-","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750213648865909.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":"back2school.png","personalityItems":{"nameplate":"vip_nameplate_1.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2828108414,"userName":"(creamy_moon)","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750074913998188.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3679810224,"userName":"\u0000","pic":"http://staticgs.sandboxol.com/avatar/1750519500600450.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2932785086,"userName":"CT-ZENO-DEMON","pic":"http://staticgs.sandboxol.com/avatar/1750571309797173.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3036163102,"userName":"ƘƖM ƝƛƠMƖ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1734789714766464.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6345918286,"userName":"Hotty۫","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750153865742928.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2479457342,"userName":"Lost_Death.","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1708602200259830.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6202124542,"userName":"SHRI__KRISHNA","pic":"http://staticgs.sandboxol.com/avatar/1750431332378974.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2468546222,"userName":"_OLD_LEGEND_","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1748600595466877.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":57321727,"userName":"$God_ER_Samarth$","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1749827870432858.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2399386208,"userName":"x.Rexy!_","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750070026648675.jpg","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2070141184,"userName":" LIGHT","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1723701847455541.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":"back2school.png","personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6272814574,"userName":"SENPAImakdi","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1745866350975347.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":970297102,"userName":"Eku_Is_Back","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1747629042121756.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2542441774,"userName":"Sat!sh ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1743431300259598.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2046108094,"userName":"ProBandaBG","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1748203937595147.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":228458175,"userName":"ADMIN_jailbreak","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1739097945564758.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":339321055,"userName":"MrSúnBG","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1743686119886507.jpg","identity":2,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":"back2school.png","personalityItems":{"nameplate":"vip_nameplate_1.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6554963918,"userName":"ZexyAI","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1744307641549801.jpg","identity":1,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6171595822,"userName":"Armygirl987_4743","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1731391847098701.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3466401216,"userName":"%Alpha%","pic":"http://staticgs.sandboxol.com/avatar/1750501787461269.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":486307935,"userName":"MÀSTERPIECE","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750138823013962.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6027078574,"userName":"SUJAL|ŤÐƘ×EMS","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750258049535698.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":"ffca00ff-fbd33fff-cad2ceff-23b8feff-677dffff-ac61ffff-fd15ffff","avatarFrame":"frame_gold_shine_ACW.svga@extra@santa_topright.svga","personalityItems":{"bubble":"{\"bg\":\"vip_bubble_003_bg.png\",\"lt\":\"vip_bubble_003_lt.svga\",\"lb\":\"vip_bubble_003_lb.svga\",\"rt\":\"vip_bubble_003_rt.svga\",\"rb\":\"vip_bubble_003_rb.svga\"}","nameplate":"vip_nameplate_10.svga"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":5864822494,"userName":"_.KILLER._(AGY)","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750233050308927.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3084826206,"userName":"FiyazkillerBG","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1744602175194342.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3614201616,"userName":"ROYALNESSGAMERZ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1747047051789652.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":2873014190,"userName":" xShadow ","pic":"http://staticgs.sandboxol.com/avatar/1750484729257590.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6431718494,"userName":"ฅ_abhi_ฅ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750240460824381.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6094121982,"userName":"ΞIƝƊ-ƘIƦMƛƊƛΞψ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1747722316319588.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_1.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":1104717710,"userName":"Et-Spidey(Sin)","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1749654815946267.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_1.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":59574527,"userName":"x.YuKi._!!","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1750331376943106.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":"back2school.png","personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":3025375294,"userName":"GlítçhBLÓÇMÀÑGÓ","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1740141422044961.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null},{"userId":6261853918,"userName":"FIRÈ_ÑÌÑJA","pic":"http://staticgs.sandboxol.com/sandbox/avatar/1746091062725953.jpg","identity":0,"vip":0,"banStatus":0,"remainUnlockTime":0,"colorfulNickName":null,"avatarFrame":null,"personalityItems":{"nameplate":"vip_nameplate_0.png"},"honorLv":0,"fansClubLv":null,"chatStatus":0,"lastModifyNoticeTime":null}],"GroupMembersCounted":37}
User: System data who is talking to you right now: 6345918286
User: System data of last 100 group messages: {"list":[{"date":"2025-06-23T09:22:18.473Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-C7DQ-BT2D-TRU9","content":"ego distrub hojegi"},{"date":"2025-06-23T09:22:19.354Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-C7KM-JU2D-TRU9","content":"only human like bts\nnot Janwar ex-mohit"},{"date":"2025-06-23T09:22:29.642Z","senderUserId":"2399386208","messageType":"RC:TxtMsg","messageUId":"CNJG-CA52-K58D-TRU9","content":"..."},{"date":"2025-06-23T09:22:30.054Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-CA89-K5OD-TRU9","content":"ex nahi eg hota bo"},{"date":"2025-06-23T09:22:41.369Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CD0M-CCED-TRU9","content":"example?","referMsg":"ex nahi eg hota bo"},{"date":"2025-06-23T09:22:44.453Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-CDOP-CEKD-TRU9","content":"animal are more loyal than humans"},{"date":"2025-06-23T09:22:45.652Z","senderUserId":"6345918286","messageType":"RC:TxtMsg","messageUId":"CNJG-CE25-4F6D-TRU9","content":"."},{"date":"2025-06-23T09:22:47.659Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CEHQ-SGQD-TRU9","content":"eganal nai hota","referMsg":"ex nahi eg hota bo"},{"date":"2025-06-23T09:23:02.450Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CI5C-KQED-TRU9","content":"oooh ache animal teri tarah chakke nai","referMsg":"animal are more loyal than humans"},{"date":"2025-06-23T09:23:10.084Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CK11-4V0D-TRU9","content":"Jaanwar nhi Paagal","referMsg":"only human like bts\nnot Janwar ex-mohit"},{"date":"2025-06-23T09:23:22.420Z","senderUserId":"2399386208","messageType":"RC:TxtMsg","messageUId":"CNJG-CN1D-57GD-TRU9","content":"to"},{"date":"2025-06-23T09:23:24.053Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-CNE5-D8MD-TRU9","content":"chakke me nahi hon bts han"},{"date":"2025-06-23T09:23:29.253Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-COMP-DBAD-TRU9","content":"proof bhi mepe"},{"date":"2025-06-23T09:23:32.629Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CPH5-DD6D-TRU9","content":"tu hai ","referMsg":"chakke me nahi hon bts han"},{"date":"2025-06-23T09:23:45.114Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-CSIM-LMID-TRU9","content":"ye or iska bakwaas proof","referMsg":"proof bhi mepe"},{"date":"2025-06-23T09:23:52.853Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-CUF5-DRSD-TRU9","content":"oki"},{"date":"2025-06-23T09:23:56.254Z","senderUserId":"2959694910","messageType":"RC:TxtMsg","messageUId":"CNJG-CV9N-LTUD-TRU9","content":"hat be"},{"date":"2025-06-23T09:24:04.521Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-D1AA-E2OD-TRU9","content":"areee mohit tere me kya hai jo bts me nai hai"},{"date":"2025-06-23T09:24:04.774Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-D1C9-M34D-TRU9","content":"but remeber you area ********"},{"date":"2025-06-23T09:24:05.018Z","senderUserId":"6345918286","messageType":"RC:ImgMsg","messageUId":"CNJG-D1E6-M3MD-TRU9","content":"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"},{"date":"2025-06-23T09:24:05.819Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-D1KE-U4CD-TRU9","content":"bata"},{"date":"2025-06-23T09:24:16.383Z","senderUserId":"2399386208","messageType":"RC:ReferenceMsg","messageUId":"CNJG-D46V-UAOD-TRU9","content":"🥲","referMsg":""},{"date":"2025-06-23T09:24:19.383Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-D4UD-UDGD-TRU9","content":"bruh"},{"date":"2025-06-23T09:24:20.107Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-D542-UEID-TRU9","content":"Gey nhi hona","referMsg":"areee mohit tere me kya hai jo bts me nai hai"},{"date":"2025-06-23T09:24:24.743Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-D689-UICD-TRU9","content":"tu han "},{"date":"2025-06-23T09:24:37.713Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-D9DK-ES0D-TRU9","content":"tu ga y han"},{"date":"2025-06-23T09:24:39.469Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-D9RB-ETOD-TRU9","content":"agar wo g@y hote toh puri duniya unki divani nai hoti","referMsg":"Gey nhi hona"},{"date":"2025-06-23T09:24:40.733Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DA57-EUID-TRU9","content":"english sekh"},{"date":"2025-06-23T09:24:41.088Z","senderUserId":"2959694910","messageType":"RC:TxtMsg","messageUId":"CNJG-DA80-6V2D-TRU9","content":"😂😂😂"},{"date":"2025-06-23T09:24:50.690Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DCJ0-N5KD-TRU9","content":"nah I m not like u","referMsg":"tu ga y han"},{"date":"2025-06-23T09:24:52.713Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DD2Q-F6OD-TRU9","content":"ga y are loved by world"},{"date":"2025-06-23T09:24:57.903Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DEBB-VBCD-TRU9","content":"becuase wo gand dete"},{"date":"2025-06-23T09:25:05.518Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-DG6R-NG8D-TRU9","content":"toh tujhe koi pyaar kyu nai krta"},{"date":"2025-06-23T09:25:13.027Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DI1G-VK6D-TRU9","content":"toh mai kya karu James Charles bhi toh famous hai","referMsg":"agar wo g@y hote toh puri duniya unki divani nai hoti"},{"date":"2025-06-23T09:25:14.103Z","senderUserId":"2568310432","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DI9T-VL0D-TRU9","content":"bro","referMsg":"toh tujhe koi pyaar kyu nai krta"},{"date":"2025-06-23T09:25:28.433Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DLPS-FUAD-TRU9","content":"ye ispe kyo jaro"},{"date":"2025-06-23T09:25:38.869Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DOBD-868D-TRU9","content":"kya hua ego hurt hua kya","referMsg":"bro"},{"date":"2025-06-23T09:25:45.534Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DPVF-GAMD-TRU9","content":"no"},{"date":"2025-06-23T09:25:46.549Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DQ7D-8BGD-TRU9","content":"tu bts pe kyu gya","referMsg":"ye ispe kyo jaro"},{"date":"2025-06-23T09:26:01.614Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-DTT3-GMAD-TRU9","content":"muj se isley koi pyarr na karta😔"},{"date":"2025-06-23T09:26:06.381Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-DV2B-8QMD-TRU9","content":"nhi toh Teri maa Mai jau kya?","referMsg":"tu bts pe kyu gya"},{"date":"2025-06-23T09:26:07.089Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-DV7S-8RID-TRU9","content":"ha nai krta"},{"date":"2025-06-23T09:26:12.373Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-E0H5-90KD-TRU9","content":"they can affored my egi "},{"date":"2025-06-23T09:26:14.814Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-E147-H30D-TRU9","content":"ego"},{"date":"2025-06-23T09:26:20.159Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-E2DV-P76D-TRU9","content":"bhai tu bich me mat bhok ku tto ki tarah","referMsg":"nhi toh Teri maa Mai jau kya?"},{"date":"2025-06-23T09:26:28.439Z","senderUserId":"6345918286","messageType":"RC:TxtMsg","messageUId":"CNJG-E4EL-PDID-TRU9","content":"._."},{"date":"2025-06-23T09:26:30.563Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-E4V8-PFGD-TRU9","content":"mat bol re"},{"date":"2025-06-23T09:26:31.904Z","senderUserId":"6345918286","messageType":"RC:ImgMsg","messageUId":"CNJG-E59O-1GQD-TRU9","content":"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"},{"date":"2025-06-23T09:26:43.469Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-E843-9RQD-TRU9","content":"but they can afford u ","referMsg":"they can affored my egi "},{"date":"2025-06-23T09:26:44.232Z","senderUserId":"6345918286","messageType":"RC:TxtMsg","messageUId":"CNJG-E8A2-1SMD-TRU9","content":"I don't like BTS and neither Mohit so team up🤠"},{"date":"2025-06-23T09:26:44.493Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-E8C3-9T2D-TRU9","content":"you are just barking like han dog"},{"date":"2025-06-23T09:26:49.533Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-E9JF-A34D-TRU9","content":"and am feeding you"},{"date":"2025-06-23T09:26:53.523Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-EAIK-Q72D-TRU9","content":"and I can afford u too","referMsg":"but they can afford u "},{"date":"2025-06-23T09:27:15.663Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-EFVJ-QRUD-TRU9","content":"beacuse they dont have high ego like me"},{"date":"2025-06-23T09:27:15.754Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-EG0A-IS4D-TRU9","content":"sapne dekh mohit\nkyuki sapne dekhne ke paise ni lagte","referMsg":"and I can afford u too"},{"date":"2025-06-23T09:27:29.854Z","senderUserId":"2568310432","messageType":"RC:ReferenceMsg","messageUId":"CNJG-EJEF-J9MD-TRU9","content":"tune experince kiya han ","referMsg":"sapne dekh mohit\nkyuki sapne dekhne ke paise ni lagte"},{"date":"2025-06-23T09:27:43.834Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-EMRM-JLCD-TRU9","content":"we dont watch dream "},{"date":"2025-06-23T09:27:48.903Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-EO39-RR2D-TRU9","content":"we fu ck up haters"},{"date":"2025-06-23T09:27:55.033Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-EPJ6-C0QD-TRU9","content":"just like yoi"},{"date":"2025-06-23T09:27:55.815Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-EPP9-S26D-TRU9","content":"khud ko kya smjh ke rakha hai iss behena ne._.","referMsg":"sapne dekh mohit\nkyuki sapne dekhne ke paise ni lagte"},{"date":"2025-06-23T09:28:07.539Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-ESKS-SF0D-TRU9","content":"tu bich me mat bol bhai","referMsg":"khud ko kya smjh ke rakha hai iss behena ne._."},{"date":"2025-06-23T09:28:14.350Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-EUA3-KKSD-TRU9","content":"tu kr wl","referMsg":"tune experince kiya han "},{"date":"2025-06-23T09:28:15.519Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-EUJ7-SLSD-TRU9","content":"le"},{"date":"2025-06-23T09:28:22.133Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-F06T-CRID-TRU9","content":"!ai chat f uck hooty"},{"date":"2025-06-23T09:28:29.528Z","senderUserId":"2399386208","messageType":"RC:TxtMsg","messageUId":"CNJG-F20M-532D-TRU9","content":"..."},{"date":"2025-06-23T09:28:30.904Z","senderUserId":"2568310432","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F2BE-54ED-TRU9","content":"noo ned chakke pasand na mugy","referMsg":"tu kr wl"},{"date":"2025-06-23T09:28:43.916Z","senderUserId":"6554963918","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F5H3-5K2D-TRU9","content":"same to you 😎 keep it chill bro","referMsg":"AI Answer to: f uck hooty"},{"date":"2025-06-23T09:28:46.859Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F682-TMCD-TRU9","content":"par tu khud hai ek chakka","referMsg":"noo ned chakke pasand na mugy"},{"date":"2025-06-23T09:28:47.484Z","senderUserId":"2399386208","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F6CV-5NED-TRU9","content":"mugy nai muje hota he🤧","referMsg":"noo ned chakke pasand na mugy"},{"date":"2025-06-23T09:28:59.872Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F9DO-63AD-TRU9","content":"k","referMsg":"tu bich me mat bol bhai"},{"date":"2025-06-23T09:29:01.303Z","senderUserId":"2568310432","messageType":"RC:ReferenceMsg","messageUId":"CNJG-F9OT-U4OD-TRU9","content":"apne batt mat bata","referMsg":"par tu khud hai ek chakka"},{"date":"2025-06-23T09:29:07.188Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FB6T-69ED-TRU9","content":"ayyy","referMsg":"!ai chat f uck hooty"},{"date":"2025-06-23T09:29:13.909Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-FCRD-EFSD-TRU9","content":"mohit ek ander ek ladki badi hui hai guys trust me\nboys be safe🙏"},{"date":"2025-06-23T09:29:27.781Z","senderUserId":"2399386208","messageType":"RC:TxtMsg","messageUId":"CNJG-FG7P-ESOD-TRU9","content":"..."},{"date":"2025-06-23T09:29:31.436Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FH4B-6VMD-TRU9","content":"moye moye","referMsg":"same to you 😎 keep it chill bro"},{"date":"2025-06-23T09:29:43.591Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FK39-V7GD-TRU9","content":"aayein ","referMsg":"mohit ek ander ek ladki badi hui hai guys trust me\nboys be safe🙏"},{"date":"2025-06-23T09:29:48.679Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FLB1-VC2D-TRU9","content":"me teri baat kr rhi hu \nsamjha nai kese samjhega tere ander dimaag nai hai","referMsg":"apne batt mat bata"},{"date":"2025-06-23T09:29:54.838Z","senderUserId":"6554963918","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FMR5-NH4D-TRU9","content":"moye moye 😄 what's up bro @Hotty۫?","referMsg":"AI Answer to: moye moye"},{"date":"2025-06-23T09:29:57.278Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-FNE7-NK0D-TRU9","content":"yes"},{"date":"2025-06-23T09:29:59.204Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FNT9-7MAD-TRU9","content":"basi","referMsg":"mohit ek ander ek ladki badi hui hai guys trust me\nboys be safe🙏"},{"date":"2025-06-23T09:30:08.338Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-FQ4K-NTID-TRU9","content":"i dont have brain"},{"date":"2025-06-23T09:30:15.890Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-FRVK-G3MD-TRU9","content":"yea"},{"date":"2025-06-23T09:30:24.598Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-FU3L-GB6D-TRU9","content":"but my heart is full of ego"},{"date":"2025-06-23T09:30:27.275Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-FUOI-OD2D-TRU9","content":"idk I forgot","referMsg":"moye moye 😄 what's up bro @Hotty۫?"},{"date":"2025-06-23T09:30:31.578Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-FVQ6-GG8D-TRU9","content":"and can *** k haters like yiu"},{"date":"2025-06-23T09:30:38.483Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-G1G4-OLAD-TRU9","content":"who just flirt"},{"date":"2025-06-23T09:30:39.399Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G1N9-OM4D-TRU9","content":"R.I.P","referMsg":"i dont have brain"},{"date":"2025-06-23T09:30:40.763Z","senderUserId":"2399386208","messageType":"RC:TxtMsg","messageUId":"CNJG-G21U-ONAD-TRU9","content":"kisiko mute bhi nai kr skta 😭💔"},{"date":"2025-06-23T09:30:44.078Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-G2RR-GQCD-TRU9","content":"hmm"},{"date":"2025-06-23T09:30:47.234Z","senderUserId":"6554963918","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G3KG-GTID-TRU9","content":"haha no worries 🤠 what did you forget exactly?","referMsg":"AI Answer to: idk I forgot"},{"date":"2025-06-23T09:30:53.374Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G54F-H1GD-TRU9","content":"gc hi quit kar dete hai","referMsg":"kisiko mute bhi nai kr skta 😭💔"},{"date":"2025-06-23T09:30:57.754Z","senderUserId":"6600698446","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G66M-H6KD-TRU9","content":"kitna bhokte hai haters","referMsg":"and can *** k haters like yiu"},{"date":"2025-06-23T09:30:59.118Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G6HB-H80D-TRU9","content":"idk","referMsg":"haha no worries 🤠 what did you forget exactly?"},{"date":"2025-06-23T09:31:01.128Z","senderUserId":"2399386208","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G712-19CD-TRU9","content":"🥲","referMsg":"gc hi quit kar dete hai"},{"date":"2025-06-23T09:31:04.739Z","senderUserId":"2568310432","messageType":"RC:TxtMsg","messageUId":"CNJG-G7T8-PCUD-TRU9","content":"larki han tu isley jata na bolra"},{"date":"2025-06-23T09:31:06.954Z","senderUserId":"6600698446","messageType":"RC:TxtMsg","messageUId":"CNJG-G8EI-HFCD-TRU9","content":"thanks mhadev me Bach gyi"},{"date":"2025-06-23T09:31:08.750Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G8SJ-HGUD-TRU9","content":"more like yap","referMsg":"kitna bhokte hai haters"},{"date":"2025-06-23T09:31:12.330Z","senderUserId":"6554963918","messageType":"RC:ReferenceMsg","messageUId":"CNJG-G9OI-HJOD-TRU9","content":"haha happens 😄 wanna chat or play some Blockman Go games? 🎮✨","referMsg":"AI Answer to: idk"},{"date":"2025-06-23T09:31:17.638Z","senderUserId":"2568310432","messageType":"RC:ReferenceMsg","messageUId":"CNJG-GB21-HNID-TRU9","content":"haters tu han ye man bhoul","referMsg":"kitna bhokte hai haters"},{"date":"2025-06-23T09:31:20.789Z","senderUserId":"6345918286","messageType":"RC:ReferenceMsg","messageUId":"CNJG-GBQL-9QAD-TRU9","content":"more like lakdi","referMsg":"larki han tu isley jata na bolra"}]}
User: games?
Assistant:wanna play some Blockman Go mini games or just chat here? 🎮😄
f59e028dab9b375330416142User: 30m berapa angka User: 30m berapa angka Assistant:
"30m" biasanya berarti 30 menit. Jika maksud Anda ingin mengubah 30 menit menjadi angka dalam satuan tertentu, berikut beberapa konversi yang umum: - 30 menit = 0,5 jam - 30 menit = 1800 detik Jika maksud Anda berbeda, bisa jelaskan lebih detail agar saya bisa membantu dengan tepat.
0f30b33270df0dde5340f5f6
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Trading Journal</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background: #f4f6f8;
}
/* Header Wrapper */
#headerWrapper {
max-width: 1100px;
margin: 0 auto 25px;
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
#headerWrapper h1 {
margin: 0;
}
#headerWrapper label {
font-weight: bold;
font-size: 16px;
margin-right: 8px;
}
#headerWrapper input[type="number"] {
width: 120px;
padding: 5px 8px;
font-size: 16px;
}
input[disabled] {
background-color: #e9ecef;
}
form {
background: white;
padding: 20px 30px;
border-radius: 8px;
margin-bottom: 30px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
form .grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px 40px;
align-items: center;
}
form .grid-container div {
display: flex;
align-items: center;
}
label {
width: 140px;
font-weight: bold;
margin-right: 12px;
white-space: nowrap;
}
input[type="text"],
input[type="number"],
input[type="time"],
input[type="date"],
select,
textarea {
flex: 1;
padding: 6px 8px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
min-width: 0;
}
textarea {
resize: vertical;
}
/* Full width fields: e.g. textareas or wide inputs below */
.full-width {
grid-column: 1 / -1;
margin-top: 10px;
}
/* Buttons */
button {
background-color: #007bff;
color: white;
border:none;
padding: 10px 16px;
cursor: pointer;
border-radius: 4px;
font-size: 16px;
}
button:disabled {
background-color: #aaa;
cursor: not-allowed;
}
button:hover:not(:disabled) {
background-color: #0056b3;
}
#buttonsWrapper {
margin-top: 20px;
display: flex;
justify-content: space-between;
max-width: 1100px;
margin-left: auto;
margin-right: auto;
gap: 10px;
}
/* Table styling */
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
th, td {
text-align: center;
padding: 8px;
border-bottom: 1px solid #ddd;
font-size: 13px;
vertical-align: middle;
word-break: break-word;
}
th {
background-color: #007bff;
color: white;
position: sticky;
top: 0;
z-index: 2;
}
tr:hover {
background-color: #f1f1f1;
}
.actions button {
background-color: #dc3545;
margin: 0 2px;
padding: 5px 8px;
font-size: 12px;
}
.actions button.edit {
background-color: #28a745;
}
#clearAllBtn {
background-color: #6c757d;
}
/* Responsive for smaller screens: stack form fields */
@media (max-width: 700px) {
form .grid-container {
grid-template-columns: 1fr;
}
label {
width: 110px;
}
#buttonsWrapper {
flex-direction: column;
gap: 10px;
}
#buttonsWrapper button {
width: 100%;
}
}
</style>
</head>
<body>
<!-- Header with Balance input -->
<div id="headerWrapper">
<h1>Trading Journal</h1>
<div>
<label for="initialBalance">Balance:</label>
<input type="number" id="initialBalance" min="0" step="100" />
</div>
</div>
<form id="tradeForm" autocomplete="off">
<input type="hidden" id="tradeIndex" />
<div class="grid-container">
<div>
<label for="trade">Trade #</label>
<input type="number" id="trade" min="1" placeholder="e.g. 1" />
</div>
<div>
<label for="emaBias">M15 EMA's Bias</label>
<select id="emaBias">
<option value="">Select</option>
<option>Uptrend</option>
<option>Downtrend</option>
<option>Sideways</option>
</select>
</div>
<div>
<label for="day">Day (Date)</label>
<input type="date" id="day" />
</div>
<div>
<label for="time">Time</label>
<input type="time" id="time" />
</div>
<div>
<label for="symbol">Symbol</label>
<input type="text" id="symbol" placeholder="e.g. EURUSD" />
</div>
<div>
<label for="session">Session When Open</label>
<select id="session">
<option value="">Select</option>
<option>Asia</option>
<option>London</option>
<option>New York</option>
<option>Other</option>
</select>
</div>
<div>
<label for="risk">Risk %</label>
<input type="number" id="risk" min="0" step="0.01" placeholder="e.g. 1.5" />
</div>
<div>
<label for="rrr">RRR (Risk Reward Ratio)</label>
<input type="number" id="rrr" min="0" step="0.1" placeholder="e.g. 2" />
</div>
<div>
<label for="positionSize">Position Size</label>
<input type="number" id="positionSize" min="0" step="0.01" placeholder="e.g. 0.5" />
</div>
<div>
<label for="mode">Mode</label>
<select id="mode">
<option value="">Select</option>
<option>Buy</option>
<option>Sell</option>
</select>
</div>
<div>
<label for="entry">Entry Price</label>
<input type="number" id="entry" min="0" step="0.0001" placeholder="e.g. 1.1234" />
</div>
<div>
<label for="sl">Stop Loss (SL)</label>
<input type="number" id="sl" min="0" step="0.0001" placeholder="e.g. 1.1200" />
</div>
<div>
<label for="tp">Take Profit (TP)</label>
<input type="number" id="tp" min="0" step="0.0001" placeholder="e.g. 1.1300" />
</div>
<div>
<label for="exitType">Exit Type</label>
<select id="exitType">
<option value="">Select</option>
<option value="SL">Stop Loss (SL)</option>
<option value="TP">Take Profit (TP)</option>
<option value="Manual">Manual</option>
</select>
</div>
<div>
<label for="exit">Exit Price</label>
<input type="number" id="exit" min="0" step="0.0001" placeholder="Price exited at" />
</div>
<div>
<label for="close">Close Price</label>
<input type="number" id="close" min="0" step="0.0001" placeholder="Only if manual exit" disabled />
</div>
<div class="full-width">
<label for="whyOpen" style="vertical-align: top;">Why Open</label>
<textarea id="whyOpen" rows="2" placeholder="Explain why you opened this trade"></textarea>
</div>
<div class="full-width">
<label for="feelings" style="vertical-align: top;">Feelings</label>
<textarea id="feelings" rows="2" placeholder="What were your emotions"></textarea>
</div>
<div>
<label for="closeRrr">Close RRR</label>
<input type="number" id="closeRrr" min="0" step="0.1" placeholder="Exit RRR" />
</div>
<div>
<label for="closeTime">Close Time</label>
<input type="time" id="closeTime" />
</div>
<div class="full-width">
<label for="whyCloseManual" style="vertical-align: top;">Why Close if Exit Manual</label>
<textarea id="whyCloseManual" rows="2" placeholder="Reason for manual exit"></textarea>
</div>
<div>
<label for="profit">Profit</label>
<input type="number" id="profit" step="0.01" placeholder="e.g. 25.50" />
</div>
<div>
<label for="accountReward">Account Reward (%)</label>
<input type="number" id="accountReward" step="0.0001" placeholder="Calculated automatically" disabled />
</div>
<div class="full-width">
<label for="resultAfterClose" style="vertical-align: top;">Result After Close if Exit Manual</label>
<textarea id="resultAfterClose" rows="3" placeholder="Notes after trade closes"></textarea>
</div>
</div>
<div id="buttonsWrapper">
<button type="submit" id="submitBtn">Add Trade</button>
<button type="button" id="clearAllBtn" title="Clear All Trades">Clear All</button>
<button type="button" id="exportBtn" title="Export all trades as CSV">Export Trades</button>
</div>
</form>
<table id="tradesTable" aria-label="Trading journal records">
<thead>
<tr>
<th>Trade #</th>
<th>Day</th>
<th>Time</th>
<th>Symbol</th>
<th>Session</th>
<th>M15 EMA's Bias</th>
<th>Risk %</th>
<th>RRR</th>
<th>Position Size</th>
<th>Mode</th>
<th>Entry</th>
<th>SL</th>
<th>TP</th>
<th>Exit Type</th>
<th>Exit</th>
<th>Close</th>
<th>Close RRR</th>
<th>Close Time</th>
<th>Why Open</th>
<th>Feelings</th>
<th>Why Close If Manual</th>
<th>Profit</th>
<th>Account Reward (%)</th>
<th>Result After Close</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!-- Trades inserted by JS -->
</tbody>
</table>
<script>
const tradeForm = document.getElementById('tradeForm');
const tradesTableBody = document.querySelector('#tradesTable tbody');
const clearAllBtn = document.getElementById('clearAllBtn');
const submitBtn = document.getElementById('submitBtn');
const exportBtn = document.getElementById('exportBtn');
const exitTypeEl = document.getElementById('exitType');
const closePriceEl = document.getElementById('close');
const sessionEl = document.getElementById('session');
const timeEl = document.getElementById('time');
const initialBalanceInput = document.getElementById('initialBalance');
let initialBalance = Number(localStorage.getItem('initialBalance')) || 5000;
initialBalanceInput.value = initialBalance;
// Load trades from localStorage or start empty array
let trades = JSON.parse(localStorage.getItem('trades')) || [];
// Auto-set session based on time input
function autoSelectSession(timeValue) {
if(!timeValue) {
sessionEl.value = "";
return;
}
const [h, m] = timeValue.split(':').map(Number);
const minutesTotal = h * 60 + m;
const asiaStart = 1 * 60;
const asiaEnd = 7 * 60;
const londonStart = 10 * 60;
const londonEnd = 12 * 60;
const nyStart = 15 * 60;
const nyEnd = 18 * 60;
if (minutesTotal >= asiaStart && minutesTotal <= asiaEnd) {
sessionEl.value = "Asia";
} else if (minutesTotal >= londonStart && minutesTotal <= londonEnd) {
sessionEl.value = "London";
} else if (minutesTotal >= nyStart && minutesTotal <= nyEnd) {
sessionEl.value = "New York";
} else {
sessionEl.value = "";
}
}
timeEl.addEventListener('input', e => {
autoSelectSession(e.target.value);
});
// Enable or disable Close Price input based on Exit Type
exitTypeEl.addEventListener('change', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
} else {
closePriceEl.disabled = true;
closePriceEl.value = '';
}
});
// On load, ensure correct Close Price input state if editing
window.addEventListener('DOMContentLoaded', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
} else {
closePriceEl.disabled = true;
}
});
// Update initial balance when user changes input
initialBalanceInput.addEventListener('input', () => {
let val = Number(initialBalanceInput.value);
if (isNaN(val) || val <= 0) {
val = 5000;
}
initialBalance = val;
localStorage.setItem('initialBalance', initialBalance);
updateAccountRewardForAllTrades();
renderTrades();
});
// Calculate Account Reward % (profit relative to initial balance), 4 decimals
function calculateAccountReward(profit) {
if (profit === null || profit === undefined || isNaN(profit)) return '';
if(initialBalance === 0) return '';
return ((profit / initialBalance) * 100).toFixed(4);
}
// Update accountReward for each trade in trades array
function updateAccountRewardForAllTrades() {
trades.forEach(trade => {
trade.accountReward = calculateAccountReward(trade.profit);
});
}
// Call once on load
updateAccountRewardForAllTrades();
// Render the trades table rows
function renderTrades() {
tradesTableBody.innerHTML = '';
if(trades.length === 0) {
const tr = document.createElement('tr');
const td = document.createElement('td');
td.colSpan = 25;
td.style.textAlign = 'center';
td.textContent = 'No trades recorded yet.';
tr.appendChild(td);
tradesTableBody.appendChild(tr);
return;
}
trades.forEach((trade, index) => {
const tr = document.createElement('tr');
const fields = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose,
];
fields.forEach(field => {
const td = document.createElement('td');
td.textContent = (field === undefined || field === null) ? '' : field;
td.title = td.textContent;
tr.appendChild(td);
});
// Color code profit column: green positive, red negative
const profitTd = tr.children[20];
if(profitTd && profitTd.textContent !== '') {
const profitVal = Number(profitTd.textContent);
profitTd.style.color = profitVal >= 0 ? 'green' : 'red';
}
const actionsTd = document.createElement('td');
actionsTd.className = 'actions';
const editBtn = document.createElement('button');
editBtn.textContent = 'Edit';
editBtn.className = 'edit';
editBtn.type = 'button';
editBtn.title = "Edit trade";
editBtn.addEventListener('click', () => {
populateFormForEdit(index);
window.scrollTo(0, 0);
});
const delBtn = document.createElement('button');
delBtn.textContent = 'Delete';
delBtn.type = 'button';
delBtn.title = "Delete trade";
delBtn.addEventListener('click', () => {
if(confirm(`Are you sure you want to delete trade #${trade.trade}?`)) {
trades.splice(index, 1);
saveAndRender();
}
});
actionsTd.appendChild(editBtn);
actionsTd.appendChild(delBtn);
tr.appendChild(actionsTd);
tradesTableBody.appendChild(tr);
});
}
// Save to localStorage and render
function saveAndRender() {
localStorage.setItem('trades', JSON.stringify(trades));
renderTrades();
tradeForm.reset();
submitBtn.textContent = 'Add Trade';
document.getElementById('tradeIndex').value = '';
closePriceEl.disabled = true;
// Reset session auto set based on time (cleared)
sessionEl.value = "";
// Re-set initialBalance input (should already be set)
initialBalanceInput.value = initialBalance;
}
function populateFormForEdit(index) {
const trade = trades[index];
document.getElementById('tradeIndex').value = index;
document.getElementById('trade').value = trade.trade || '';
document.getElementById('day').value = trade.day || '';
document.getElementById('time').value = trade.time || '';
document.getElementById('symbol').value = trade.symbol || '';
document.getElementById('session').value = trade.session || '';
document.getElementById('emaBias').value = trade.emaBias || '';
document.getElementById('risk').value = trade.risk || '';
document.getElementById('rrr').value = trade.rrr || '';
document.getElementById('positionSize').value = trade.positionSize || '';
document.getElementById('mode').value = trade.mode || '';
document.getElementById('entry').value = trade.entry || '';
document.getElementById('sl').value = trade.sl || '';
document.getElementById('tp').value = trade.tp || '';
document.getElementById('exitType').value = trade.exitType || '';
document.getElementById('exit').value = trade.exit || '';
document.getElementById('close').value = trade.close || '';
document.getElementById('closeRrr').value = trade.closeRrr || '';
document.getElementById('closeTime').value = trade.closeTime || '';
document.getElementById('whyOpen').value = trade.whyOpen || '';
document.getElementById('feelings').value = trade.feelings || '';
document.getElementById('whyCloseManual').value = trade.whyCloseManual || '';
document.getElementById('profit').value = trade.profit || '';
document.getElementById('accountReward').value = trade.accountReward || '';
document.getElementById('resultAfterClose').value = trade.resultAfterClose || '';
// Set Close Price enabled state according to exitType
closePriceEl.disabled = trade.exitType === 'Manual' ? false : true;
submitBtn.textContent = 'Update Trade';
}
tradeForm.addEventListener('submit', e => {
e.preventDefault();
function getNumberValue(id) {
const v = document.getElementById(id).value;
return v === '' ? null : Number(v);
}
const tradeData = {
trade: getNumberValue('trade'),
day: document.getElementById('day').value || '',
time: document.getElementById('time').value || '',
symbol: document.getElementById('symbol').value.trim() || '',
session: document.getElementById('session').value,
emaBias: document.getElementById('emaBias').value,
risk: getNumberValue('risk'),
rrr: getNumberValue('rrr'),
positionSize: getNumberValue('positionSize'),
mode: document.getElementById('mode').value,
entry: getNumberValue('entry'),
sl: getNumberValue('sl'),
tp: getNumberValue('tp'),
exitType: document.getElementById('exitType').value,
exit: getNumberValue('exit'),
close: getNumberValue('close'),
closeRrr: getNumberValue('closeRrr'),
closeTime: document.getElementById('closeTime').value || '',
whyOpen: document.getElementById('whyOpen').value.trim() || '',
feelings: document.getElementById('feelings').value.trim() || '',
whyCloseManual: document.getElementById('whyCloseManual').value.trim() || '',
profit: getNumberValue('profit'),
accountReward: calculateAccountReward(getNumberValue('profit')),
resultAfterClose: document.getElementById('resultAfterClose').value.trim() || '',
};
const index = document.getElementById('tradeIndex').value;
if(index === '') {
trades.push(tradeData);
} else {
trades[index] = tradeData;
}
saveAndRender();
});
clearAllBtn.addEventListener('click', () => {
if(confirm('Are you sure you want to delete all trades? This action cannot be undone.')) {
trades = [];
saveAndRender();
}
});
// Helper to escape CSV values properly (quote if needed)
function csvEscape(value) {
if (value === null || value === undefined) return '';
const str = String(value);
if(str.includes('"') || str.includes(',') || str.includes('\n') || str.includes('\r')) {
return `"${str.replace(/"/g, '""')}"`;
}
return str;
}
// Export trades as CSV
function exportTradesToCSV() {
if (trades.length === 0) {
alert('No trades to export.');
return;
}
const headers = [
"Trade #",
"Day",
"Time",
"Symbol",
"Session",
"M15 EMA's Bias",
"Risk %",
"RRR",
"Position Size",
"Mode",
"Entry",
"SL",
"TP",
"Exit Type",
"Exit",
"Close",
"Close RRR",
"Close Time",
"Why Open",
"Feelings",
"Why Close If Manual",
"Profit",
"Account Reward (%)",
"Result After Close"
];
let csvContent = headers.map(csvEscape).join(",") + "\r\n";
trades.forEach(trade => {
const row = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose
].map(csvEscape);
csvContent += row.join(",") + "\r\n";
});
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'trades_export.csv';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 0);
}
exportBtn.addEventListener('click', exportTradesToCSV);
renderTrades();
</script>
</body>
</html>Your provided HTML/JS code is a fully functional Trading Journal web app with these key features:
- Set an initial account **Balance** (defaults to 5000 if none specified).
- Add trades with detailed fields: trade number, date/time, symbol, session, EMA bias, risk %, RRR, position size, mode, entry/exit prices, stop loss, take profit, exit info, reasons, feelings, profit, and notes.
- Trades are listed in a table with options to **Edit**, **Delete**, and **Clear All** trades.
- The app automatically calculates and shows **Account Reward (%)** — profit as % of the initial balance.
- Auto-detects trading session based on time input.
- Enables/disables the Close Price field depending on Exit Type.
- Persists all data in **localStorage**.
- Exports trades as CSV file.
---
If you want improvements or to add features, here are some suggestions and how you could implement them:
### 1. **Validate required fields before adding trade**
Right now, no validation is enforced. For example, Trade #, day, time, symbol, mode, profit, etc., could be required fields.
Add in the submit event handler, e.g.:
```js
if (!tradeData.trade || !tradeData.day || !tradeData.time || !tradeData.symbol || !tradeData.mode) {
alert("Please fill out all required fields: Trade #, Day, Time, Symbol, Mode.");
return;
}
```
### 2. **Sort trades by trade number or date automatically**
After adding or editing, you may want trades sorted to keep the journal organized.
Add this before `saveAndRender()`:
```js
trades.sort((a, b) => (a.trade || 0) - (b.trade || 0));
```
### 3. **Calculate Profit automatically from Entry, Exit/Close, Position Size, etc.**
Right now profit is user-entered. You could implement profit calculation logic based on mode (Buy/Sell), entry, exit/close price, and position size, so users only have to enter prices.
Example (simplified):
```js
function calculateProfit(trade) {
if (!trade.entry || !trade.positionSize) return null;
let exitPrice = trade.exitType === 'Manual' ? trade.close : trade.exit;
if (!exitPrice) return null;
let profit = 0;
if (trade.mode === 'Buy') {
profit = (exitPrice - trade.entry) * trade.positionSize * 100000; // assuming 100k units
} else if (trade.mode === 'Sell') {
profit = (trade.entry - exitPrice) * trade.positionSize * 100000;
}
return parseFloat(profit.toFixed(2));
}
```
You could call this when submitting the form and auto-fill the profit field.
### 4. **Improve UX by adding confirmation modals**
The confirm dialogs are currently plain `window.confirm`. For better UX, you could add a custom modal or use a library.
### 5. **Add pagination or search/filter on the table**
When many trades are added, the table could get long. Adding search, filter by date, symbol, or pagination would help usability.
---
If you want, I can help you implement any of these improvements or another feature. Otherwise, the code you provided should work very well as a personal trading journal app! Let me know if you have specific requests or questions.69fe7b7a16576edae93a5ba8DO ALL THIS UPDATEs , AND ACTUAL BALLANCE(INITIAL+PROFITS), AND ADD BUTTON STATS (LINK TO stats.htm)
Certainly! I've updated your Trading Journal app with all requested improvements:
- **Validation** for required fields on submit.
- **Sort trades by Trade #** ascending after adding/editing.
- **Auto-calculate Profit** based on Mode, Entry, Exit/Close, and Position Size.
- Show and update **Actual Balance** (Initial Balance + sum of all profits) in the header.
- Added a new **Stats** button linking to `stats.htm`.
- Minor UX tweaks: Profit field is now read-only and auto-calculated.
- Disabled form submit button if validation fails (with alert).
Below is the full updated HTML with inline comments about changes.
Replace your entire current file with this to get all features working:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Trading Journal</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background: #f4f6f8;
}
/* Header Wrapper */
#headerWrapper {
max-width: 1100px;
margin: 0 auto 25px;
display: flex;
align-items: center;
justify-content: center;
gap: 25px;
flex-wrap: wrap;
}
#headerWrapper h1 {
margin: 0;
}
#headerWrapper label {
font-weight: bold;
font-size: 16px;
margin-right: 8px;
}
#headerWrapper input[type="number"] {
width: 120px;
padding: 5px 8px;
font-size: 16px;
}
#actualBalanceWrapper {
font-weight: bold;
font-size: 16px;
background-color: #007bff;
color: white;
padding: 6px 12px;
border-radius: 4px;
}
input[disabled] {
background-color: #e9ecef;
}
form {
background: white;
padding: 20px 30px;
border-radius: 8px;
margin-bottom: 30px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
form .grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px 40px;
align-items: center;
}
form .grid-container div {
display: flex;
align-items: center;
}
label {
width: 140px;
font-weight: bold;
margin-right: 12px;
white-space: nowrap;
}
input[type="text"],
input[type="number"],
input[type="time"],
input[type="date"],
select,
textarea {
flex: 1;
padding: 6px 8px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
min-width: 0;
}
textarea {
resize: vertical;
}
/* Full width fields: e.g. textareas or wide inputs below */
.full-width {
grid-column: 1 / -1;
margin-top: 10px;
}
/* Buttons */
button {
background-color: #007bff;
color: white;
border:none;
padding: 10px 16px;
cursor: pointer;
border-radius: 4px;
font-size: 16px;
}
button:disabled {
background-color: #aaa;
cursor: not-allowed;
}
button:hover:not(:disabled) {
background-color: #0056b3;
}
#buttonsWrapper {
margin-top: 20px;
display: flex;
justify-content: space-between;
max-width: 1100px;
margin-left: auto;
margin-right: auto;
gap: 10px;
flex-wrap: wrap;
}
/* Table styling */
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
th, td {
text-align: center;
padding: 8px;
border-bottom: 1px solid #ddd;
font-size: 13px;
vertical-align: middle;
word-break: break-word;
}
th {
background-color: #007bff;
color: white;
position: sticky;
top: 0;
z-index: 2;
}
tr:hover {
background-color: #f1f1f1;
}
.actions button {
background-color: #dc3545;
margin: 0 2px;
padding: 5px 8px;
font-size: 12px;
}
.actions button.edit {
background-color: #28a745;
}
#clearAllBtn {
background-color: #6c757d;
}
/* Responsive for smaller screens: stack form fields */
@media (max-width: 700px) {
form .grid-container {
grid-template-columns: 1fr;
}
label {
width: 110px;
}
#buttonsWrapper {
flex-direction: column;
gap: 10px;
}
#buttonsWrapper button {
width: 100%;
}
#headerWrapper {
justify-content: center;
}
}
</style>
</head>
<body>
<!-- Header with Balance and Actual Balance display -->
<div id="headerWrapper" aria-label="Account balances">
<h1>Trading Journal</h1>
<div>
<label for="initialBalance">Balance:</label>
<input type="number" id="initialBalance" min="0" step="100" aria-describedby="balanceDesc"/>
<div id="balanceDesc" style="font-weight:normal; font-size:12px; color: #555;">Initial account balance</div>
</div>
<div id="actualBalanceWrapper" aria-live="polite" title="Initial Balance plus all profits">Actual Balance: $<span id="actualBalance">0.00</span></div>
</div>
<form id="tradeForm" autocomplete="off" aria-label="Add or edit trade">
<input type="hidden" id="tradeIndex" />
<div class="grid-container">
<div>
<label for="trade">Trade #<sup style="color:red">*</sup></label>
<input type="number" id="trade" min="1" placeholder="e.g. 1" required aria-required="true" />
</div>
<div>
<label for="emaBias">M15 EMA's Bias</label>
<select id="emaBias" aria-label="M15 EMA's Bias">
<option value="">Select</option>
<option>Uptrend</option>
<option>Downtrend</option>
<option>Sideways</option>
</select>
</div>
<div>
<label for="day">Day (Date)<sup style="color:red">*</sup></label>
<input type="date" id="day" required aria-required="true" />
</div>
<div>
<label for="time">Time<sup style="color:red">*</sup></label>
<input type="time" id="time" required aria-required="true" />
</div>
<div>
<label for="symbol">Symbol<sup style="color:red">*</sup></label>
<input type="text" id="symbol" placeholder="e.g. EURUSD" required aria-required="true" />
</div>
<div>
<label for="session">Session When Open</label>
<select id="session" aria-label="Session When Open">
<option value="">Select</option>
<option>Asia</option>
<option>London</option>
<option>New York</option>
<option>Other</option>
</select>
</div>
<div>
<label for="risk">Risk %</label>
<input type="number" id="risk" min="0" step="0.01" placeholder="e.g. 1.5" />
</div>
<div>
<label for="rrr">RRR (Risk Reward Ratio)</label>
<input type="number" id="rrr" min="0" step="0.1" placeholder="e.g. 2" />
</div>
<div>
<label for="positionSize">Position Size<sup style="color:red">*</sup></label>
<input type="number" id="positionSize" min="0" step="0.01" placeholder="e.g. 0.5" required aria-required="true" />
</div>
<div>
<label for="mode">Mode<sup style="color:red">*</sup></label>
<select id="mode" required aria-required="true">
<option value="">Select</option>
<option>Buy</option>
<option>Sell</option>
</select>
</div>
<div>
<label for="entry">Entry Price<sup style="color:red">*</sup></label>
<input type="number" id="entry" min="0" step="0.0001" placeholder="e.g. 1.1234" required aria-required="true" />
</div>
<div>
<label for="sl">Stop Loss (SL)</label>
<input type="number" id="sl" min="0" step="0.0001" placeholder="e.g. 1.1200" />
</div>
<div>
<label for="tp">Take Profit (TP)</label>
<input type="number" id="tp" min="0" step="0.0001" placeholder="e.g. 1.1300" />
</div>
<div>
<label for="exitType">Exit Type<sup style="color:red">*</sup></label>
<select id="exitType" required aria-required="true">
<option value="">Select</option>
<option value="SL">Stop Loss (SL)</option>
<option value="TP">Take Profit (TP)</option>
<option value="Manual">Manual</option>
</select>
</div>
<div>
<label for="exit">Exit Price<sup style="color:red">*</sup></label>
<input type="number" id="exit" min="0" step="0.0001" placeholder="Price exited at" required aria-required="true" />
</div>
<div>
<label for="close">Close Price</label>
<input type="number" id="close" min="0" step="0.0001" placeholder="Only if manual exit" disabled />
</div>
<div class="full-width">
<label for="whyOpen" style="vertical-align: top;">Why Open</label>
<textarea id="whyOpen" rows="2" placeholder="Explain why you opened this trade"></textarea>
</div>
<div class="full-width">
<label for="feelings" style="vertical-align: top;">Feelings</label>
<textarea id="feelings" rows="2" placeholder="What were your emotions"></textarea>
</div>
<div>
<label for="closeRrr">Close RRR</label>
<input type="number" id="closeRrr" min="0" step="0.1" placeholder="Exit RRR" />
</div>
<div>
<label for="closeTime">Close Time</label>
<input type="time" id="closeTime" />
</div>
<div class="full-width">
<label for="whyCloseManual" style="vertical-align: top;">Why Close if Exit Manual</label>
<textarea id="whyCloseManual" rows="2" placeholder="Reason for manual exit"></textarea>
</div>
<div>
<label for="profit">Profit</label>
<input type="number" id="profit" step="0.01" placeholder="Auto-calculated" disabled aria-describedby="profitDesc" />
<div id="profitDesc" style="font-weight:normal; font-size:12px; color: #555;">Automatically calculated from prices and position size</div>
</div>
<div>
<label for="accountReward">Account Reward (%)</label>
<input type="number" id="accountReward" step="0.0001" placeholder="Calculated automatically" disabled />
</div>
<div class="full-width">
<label for="resultAfterClose" style="vertical-align: top;">Result After Close if Exit Manual</label>
<textarea id="resultAfterClose" rows="3" placeholder="Notes after trade closes"></textarea>
</div>
</div>
<div id="buttonsWrapper">
<button type="submit" id="submitBtn">Add Trade</button>
<button type="button" id="clearAllBtn" title="Clear All Trades">Clear All</button>
<button type="button" id="exportBtn" title="Export all trades as CSV">Export Trades</button>
<button type="button" id="statsBtn" title="Go to statistics page">Stats</button>
</div>
</form>
<table id="tradesTable" aria-label="Trading journal records">
<thead>
<tr>
<th>Trade #</th>
<th>Day</th>
<th>Time</th>
<th>Symbol</th>
<th>Session</th>
<th>M15 EMA's Bias</th>
<th>Risk %</th>
<th>RRR</th>
<th>Position Size</th>
<th>Mode</th>
<th>Entry</th>
<th>SL</th>
<th>TP</th>
<th>Exit Type</th>
<th>Exit</th>
<th>Close</th>
<th>Close RRR</th>
<th>Close Time</th>
<th>Why Open</th>
<th>Feelings</th>
<th>Why Close If Manual</th>
<th>Profit</th>
<th>Account Reward (%)</th>
<th>Result After Close</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!-- Trades inserted by JS -->
</tbody>
</table>
<script>
const tradeForm = document.getElementById('tradeForm');
const tradesTableBody = document.querySelector('#tradesTable tbody');
const clearAllBtn = document.getElementById('clearAllBtn');
const submitBtn = document.getElementById('submitBtn');
const exportBtn = document.getElementById('exportBtn');
const statsBtn = document.getElementById('statsBtn');
const exitTypeEl = document.getElementById('exitType');
const closePriceEl = document.getElementById('close');
const sessionEl = document.getElementById('session');
const timeEl = document.getElementById('time');
const initialBalanceInput = document.getElementById('initialBalance');
const actualBalanceSpan = document.getElementById('actualBalance');
let initialBalance = Number(localStorage.getItem('initialBalance')) || 5000;
initialBalanceInput.value = initialBalance.toFixed(2);
// Load trades from localStorage or start empty array
let trades = JSON.parse(localStorage.getItem('trades')) || [];
// Auto-set session based on time input
function autoSelectSession(timeValue) {
if(!timeValue) {
sessionEl.value = "";
return;
}
const [h, m] = timeValue.split(':').map(Number);
const minutesTotal = h * 60 + m;
const asiaStart = 1 * 60;
const asiaEnd = 7 * 60;
const londonStart = 10 * 60;
const londonEnd = 12 * 60;
const nyStart = 15 * 60;
const nyEnd = 18 * 60;
if (minutesTotal >= asiaStart && minutesTotal <= asiaEnd) {
sessionEl.value = "Asia";
} else if (minutesTotal >= londonStart && minutesTotal <= londonEnd) {
sessionEl.value = "London";
} else if (minutesTotal >= nyStart && minutesTotal <= nyEnd) {
sessionEl.value = "New York";
} else {
sessionEl.value = "";
}
}
timeEl.addEventListener('input', e => {
autoSelectSession(e.target.value);
});
// Enable or disable Close Price input based on Exit Type
exitTypeEl.addEventListener('change', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
closePriceEl.required = true;
} else {
closePriceEl.disabled = true;
closePriceEl.value = '';
closePriceEl.required = false;
}
});
// On load, ensure correct Close Price input state if editing
window.addEventListener('DOMContentLoaded', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
closePriceEl.required = true;
} else {
closePriceEl.disabled = true;
closePriceEl.required = false;
}
});
// Update initial balance when user changes input
initialBalanceInput.addEventListener('input', () => {
let val = Number(initialBalanceInput.value);
if (isNaN(val) || val < 0) {
val = 5000;
}
initialBalance = val;
localStorage.setItem('initialBalance', initialBalance);
updateAccountRewardForAllTrades();
updateActualBalanceDisplay();
renderTrades();
});
// Calculate Account Reward % (profit relative to initial balance), 4 decimals
function calculateAccountReward(profit) {
if (profit === null || profit === undefined || isNaN(profit)) return '';
if(initialBalance === 0) return '';
return ((profit / initialBalance) * 100).toFixed(4);
}
// Calculate Profit based on Mode, Entry, Exit/Close, and Position Size
// Assuming position size is in lots (100,000 units)
function calculateProfit(trade) {
if (!trade.entry || !trade.positionSize || !trade.mode) return null;
// Determine exit price based on exitType
let exitPrice = null;
if (trade.exitType === 'Manual') {
exitPrice = trade.close;
} else {
exitPrice = trade.exit;
}
if (exitPrice === null || exitPrice === undefined) return null;
// Simplified profit calculation assuming forex quote in direct terms (no cross checks here)
// Profit = (exit - entry) * positionSize * 100,000 (for forex standard lot)
// For Sell mode, opposite
let profit = 0;
const lotSize = 100000;
if (trade.mode.toLowerCase() === 'buy') {
profit = (exitPrice - trade.entry) * trade.positionSize * lotSize;
} else if (trade.mode.toLowerCase() === 'sell') {
profit = (trade.entry - exitPrice) * trade.positionSize * lotSize;
} else {
return null;
}
return parseFloat(profit.toFixed(2));
}
// Update actual balance display (initial + sum of profits)
function updateActualBalanceDisplay() {
const totalProfit = trades.reduce((acc, trade) => acc + (trade.profit || 0), 0);
const actual = initialBalance + totalProfit;
actualBalanceSpan.textContent = actual.toFixed(2);
}
// Update accountReward for each trade in trades array
function updateAccountRewardForAllTrades() {
trades.forEach(trade => {
trade.accountReward = calculateAccountReward(trade.profit);
});
}
// Call once on load
updateAccountRewardForAllTrades();
updateActualBalanceDisplay();
// Render the trades table rows
function renderTrades() {
tradesTableBody.innerHTML = '';
if(trades.length === 0) {
const tr = document.createElement('tr');
const td = document.createElement('td');
td.colSpan = 25;
td.style.textAlign = 'center';
td.textContent = 'No trades recorded yet.';
tr.appendChild(td);
tradesTableBody.appendChild(tr);
updateActualBalanceDisplay();
return;
}
trades.forEach((trade, index) => {
const tr = document.createElement('tr');
const fields = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose,
];
fields.forEach(field => {
const td = document.createElement('td');
td.textContent = (field === undefined || field === null) ? '' : field;
td.title = td.textContent;
tr.appendChild(td);
});
// Color code profit column: green positive, red negative
const profitTd = tr.children[20];
if(profitTd && profitTd.textContent !== '') {
const profitVal = Number(profitTd.textContent);
profitTd.style.color = profitVal >= 0 ? 'green' : 'red';
}
const actionsTd = document.createElement('td');
actionsTd.className = 'actions';
const editBtn = document.createElement('button');
editBtn.textContent = 'Edit';
editBtn.className = 'edit';
editBtn.type = 'button';
editBtn.title = "Edit trade";
editBtn.addEventListener('click', () => {
populateFormForEdit(index);
window.scrollTo(0, 0);
});
const delBtn = document.createElement('button');
delBtn.textContent = 'Delete';
delBtn.type = 'button';
delBtn.title = "Delete trade";
delBtn.addEventListener('click', () => {
if(confirm(`Are you sure you want to delete trade #${trade.trade}?`)) {
trades.splice(index, 1);
saveAndRender();
}
});
actionsTd.appendChild(editBtn);
actionsTd.appendChild(delBtn);
tr.appendChild(actionsTd);
tradesTableBody.appendChild(tr);
});
updateActualBalanceDisplay();
}
// Save to localStorage and render
function saveAndRender() {
localStorage.setItem('trades', JSON.stringify(trades));
renderTrades();
tradeForm.reset();
submitBtn.textContent = 'Add Trade';
document.getElementById('tradeIndex').value = '';
closePriceEl.disabled = true;
closePriceEl.required = false;
// Reset session auto set based on time (cleared)
sessionEl.value = "";
// Re-set initialBalance input (should already be set)
initialBalanceInput.value = initialBalance.toFixed(2);
updateActualBalanceDisplay();
}
function populateFormForEdit(index) {
const trade = trades[index];
document.getElementById('tradeIndex').value = index;
document.getElementById('trade').value = trade.trade || '';
document.getElementById('day').value = trade.day || '';
document.getElementById('time').value = trade.time || '';
document.getElementById('symbol').value = trade.symbol || '';
document.getElementById('session').value = trade.session || '';
document.getElementById('emaBias').value = trade.emaBias || '';
document.getElementById('risk').value = trade.risk || '';
document.getElementById('rrr').value = trade.rrr || '';
document.getElementById('positionSize').value = trade.positionSize || '';
document.getElementById('mode').value = trade.mode || '';
document.getElementById('entry').value = trade.entry || '';
document.getElementById('sl').value = trade.sl || '';
document.getElementById('tp').value = trade.tp || '';
document.getElementById('exitType').value = trade.exitType || '';
document.getElementById('exit').value = trade.exit || '';
document.getElementById('close').value = trade.close || '';
document.getElementById('closeRrr').value = trade.closeRrr || '';
document.getElementById('closeTime').value = trade.closeTime || '';
document.getElementById('whyOpen').value = trade.whyOpen || '';
document.getElementById('feelings').value = trade.feelings || '';
document.getElementById('whyCloseManual').value = trade.whyCloseManual || '';
document.getElementById('profit').value = trade.profit || '';
document.getElementById('accountReward').value = trade.accountReward || '';
document.getElementById('resultAfterClose').value = trade.resultAfterClose || '';
// Set Close Price enabled state according to exitType
closePriceEl.disabled = trade.exitType === 'Manual' ? false : true;
closePriceEl.required = trade.exitType === 'Manual';
submitBtn.textContent = 'Update Trade';
}
tradeForm.addEventListener('submit', e => {
e.preventDefault();
function getNumberValue(id) {
const v = document.getElementById(id).value;
return v === '' ? null : Number(v);
}
// Validation of required fields (more than HTML5 reqs for safety)
const requiredFields = [
{id: 'trade', name: 'Trade #'},
{id: 'day', name: 'Day (Date)'},
{id: 'time', name: 'Time'},
{id: 'symbol', name: 'Symbol'},
{id: 'positionSize', name: 'Position Size'},
{id: 'mode', name: 'Mode'},
{id: 'entry', name: 'Entry Price'},
{id: 'exitType', name: 'Exit Type'},
];
for (const field of requiredFields) {
const val = document.getElementById(field.id).value;
if (!val || val.trim() === '') {
alert(`Please fill out required field: ${field.name}`);
return;
}
}
// If exitType Manual, close price is required
if(exitTypeEl.value === 'Manual' && (!closePriceEl.value || closePriceEl.value.trim() === '')) {
alert("Close Price is required for Manual exit type.");
return;
}
// Validate numeric fields have valid numbers if not empty
const numberFields = ['risk','rrr','positionSize','entry','sl','tp','exit','close','closeRrr','profit'];
for (const nf of numberFields) {
const val = document.getElementById(nf).value;
if(val) {
const num = Number(val);
if(isNaN(num)) {
alert(`Field ${nf} must be a valid number.`);
return;
}
}
}
// Generate trade data object with raw inputs
let tradeData = {
trade: getNumberValue('trade'),
day: document.getElementById('day').value || '',
time: document.getElementById('time').value || '',
symbol: document.getElementById('symbol').value.trim() || '',
session: document.getElementById('session').value,
emaBias: document.getElementById('emaBias').value,
risk: getNumberValue('risk'),
rrr: getNumberValue('rrr'),
positionSize: getNumberValue('positionSize'),
mode: document.getElementById('mode').value,
entry: getNumberValue('entry'),
sl: getNumberValue('sl'),
tp: getNumberValue('tp'),
exitType: document.getElementById('exitType').value,
exit: getNumberValue('exit'),
close: getNumberValue('close'),
closeRrr: getNumberValue('closeRrr'),
closeTime: document.getElementById('closeTime').value || '',
whyOpen: document.getElementById('whyOpen').value.trim() || '',
feelings: document.getElementById('feelings').value.trim() || '',
whyCloseManual: document.getElementById('whyCloseManual').value.trim() || '',
profit: null, // will be calculated below
accountReward: '',
resultAfterClose: document.getElementById('resultAfterClose').value.trim() || '',
};
// Calculate profit automatically:
const calculatedProfit = calculateProfit(tradeData);
if(calculatedProfit === null) {
alert('Profit could not be calculated. Please check input values.');
return;
}
tradeData.profit = calculatedProfit;
tradeData.accountReward = calculateAccountReward(tradeData.profit);
// Auto-set profit field in form for user feedback
document.getElementById('profit').value = tradeData.profit;
// Check if adding new or updating existing
const index = document.getElementById('tradeIndex').value;
if(index === '') {
trades.push(tradeData);
} else {
trades[index] = tradeData;
}
// Sort trades by trade number ascending
trades.sort((a, b) => (a.trade || 0) - (b.trade || 0));
saveAndRender();
});
clearAllBtn.addEventListener('click', () => {
if(confirm('Are you sure you want to delete all trades? This action cannot be undone.')) {
trades = [];
saveAndRender();
}
});
// Helper to escape CSV values properly (quote if needed)
function csvEscape(value) {
if (value === null || value === undefined) return '';
const str = String(value);
if(str.includes('"') || str.includes(',') || str.includes('\n') || str.includes('\r')) {
return `"${str.replace(/"/g, '""')}"`;
}
return str;
}
// Export trades as CSV
function exportTradesToCSV() {
if (trades.length === 0) {
alert('No trades to export.');
return;
}
const headers = [
"Trade #",
"Day",
"Time",
"Symbol",
"Session",
"M15 EMA's Bias",
"Risk %",
"RRR",
"Position Size",
"Mode",
"Entry",
"SL",
"TP",
"Exit Type",
"Exit",
"Close",
"Close RRR",
"Close Time",
"Why Open",
"Feelings",
"Why Close If Manual",
"Profit",
"Account Reward (%)",
"Result After Close"
];
let csvContent = headers.map(csvEscape).join(",") + "\r\n";
trades.forEach(trade => {
const row = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose
].map(csvEscape);
csvContent += row.join(",") + "\r\n";
});
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'trades_export.csv';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 0);
}
exportBtn.addEventListener('click', exportTradesToCSV);
// Stats button to go to stats.htm
statsBtn.addEventListener('click', () => {
window.location.href = 'stats.htm';
});
renderTrades();
</script>
</body>
</html>
```
---
### Summary of Important Changes:
- **Profit** is now **calculated automatically** from:
- `profit = (exitPrice - entryPrice) * positionSize * 100,000` for Buy
- OR `(entryPrice - exitPrice) * positionSize * 100,000` for Sell trades.
- User **cannot manually edit profit**; it's disabled and updated on submit.
- Validations ensure all required inputs are filled.
- Trades are sorted by trade number whenever saved.
- The header now shows **Actual Balance**, computed as Initial Balance + total profits from all trades.
- Added a **Stats** button linking to `stats.htm`.
- Close Price field enables/disables and enforces required validation based on Exit Type.
- Minor UX/refinements (e.g. required field indicators, accessible labels).
---
Open this file in a browser and it will preserve trades and balance on reload via LocalStorage, auto-calc profits, update actual balance display, support editing, deleting, clearing, exporting CSV, and a link to your stats page.
If you want me to also help build the `stats.htm` page or add any other features, just ask!c6632e1e23712c795b3b4122profit i want to set manual.
Got it! You want the **Profit** field to be **manually editable** by the user instead of auto-calculated, but still:
- Validate required fields,
- Calculate **Account Reward (%)** automatically based on the manual Profit input,
- Keep everything else as before (sorting, actual balance = initial + sum of profits, stats button, etc.).
---
Here’s what to change in the code:
### Main changes:
1. Make the **Profit input editable** (remove disabled attribute).
2. Remove the profit auto-calculation logic on submit.
3. Validate that Profit is a valid number and required.
4. Calculate Account Reward (%) from the Profit entered by user.
5. Update actual balance based on manual Profit inputs.
---
### Here is the modified **relevant parts** from the previous full code (replace or adjust accordingly):
#### 1. Profit input field (remove disabled):
```html
<div>
<label for="profit">Profit<sup style="color:red">*</sup></label>
<input type="number" id="profit" step="0.01" placeholder="Enter profit" required aria-required="true" aria-describedby="profitDesc" />
<div id="profitDesc" style="font-weight:normal; font-size:12px; color: #555;">Enter the profit manually</div>
</div>
```
---
#### 2. Update Submit handler - remove auto profit calc and validate profit input:
Replace this part of the submit event handler from:
```js
// Remove auto calculation here:
// const calculatedProfit = calculateProfit(tradeData);
// if(calculatedProfit === null) {
// alert('Profit could not be calculated. Please check input values.');
// return;
// }
// tradeData.profit = calculatedProfit;
```
With:
```js
// Get manual profit value
const manualProfit = getNumberValue('profit');
if (manualProfit === null || isNaN(manualProfit)) {
alert("Please enter a valid profit value.");
return;
}
tradeData.profit = manualProfit;
tradeData.accountReward = calculateAccountReward(tradeData.profit);
```
Also, remove the line later that sets the profit input field in the form (no need to update profit input anymore):
```js
// Remove this line:
// document.getElementById('profit').value = tradeData.profit;
```
---
#### 3. Retain sorting and rest as is.
---
### Here's the **full updated `<script>` block** for clarity with only the adjusted submit part and profit input:
```js
// Profit input manually editable, so remove auto calculation
tradeForm.addEventListener('submit', e => {
e.preventDefault();
function getNumberValue(id) {
const v = document.getElementById(id).value;
return v === '' ? null : Number(v);
}
// Validation of required fields (including profit)
const requiredFields = [
{id: 'trade', name: 'Trade #'},
{id: 'day', name: 'Day (Date)'},
{id: 'time', name: 'Time'},
{id: 'symbol', name: 'Symbol'},
{id: 'positionSize', name: 'Position Size'},
{id: 'mode', name: 'Mode'},
{id: 'entry', name: 'Entry Price'},
{id: 'exitType', name: 'Exit Type'},
{id: 'profit', name: 'Profit'},
];
for (const field of requiredFields) {
const val = document.getElementById(field.id).value;
if (!val || val.trim() === '') {
alert(`Please fill out required field: ${field.name}`);
return;
}
}
if(exitTypeEl.value === 'Manual' && (!closePriceEl.value || closePriceEl.value.trim() === '')) {
alert("Close Price is required for Manual exit type.");
return;
}
// Validate numeric fields have valid numbers if not empty
const numberFields = ['risk','rrr','positionSize','entry','sl','tp','exit','close','closeRrr','profit'];
for (const nf of numberFields) {
const val = document.getElementById(nf).value;
if(val) {
const num = Number(val);
if(isNaN(num)) {
alert(`Field ${nf} must be a valid number.`);
return;
}
}
}
let tradeData = {
trade: getNumberValue('trade'),
day: document.getElementById('day').value || '',
time: document.getElementById('time').value || '',
symbol: document.getElementById('symbol').value.trim() || '',
session: document.getElementById('session').value,
emaBias: document.getElementById('emaBias').value,
risk: getNumberValue('risk'),
rrr: getNumberValue('rrr'),
positionSize: getNumberValue('positionSize'),
mode: document.getElementById('mode').value,
entry: getNumberValue('entry'),
sl: getNumberValue('sl'),
tp: getNumberValue('tp'),
exitType: document.getElementById('exitType').value,
exit: getNumberValue('exit'),
close: getNumberValue('close'),
closeRrr: getNumberValue('closeRrr'),
closeTime: document.getElementById('closeTime').value || '',
whyOpen: document.getElementById('whyOpen').value.trim() || '',
feelings: document.getElementById('feelings').value.trim() || '',
whyCloseManual: document.getElementById('whyCloseManual').value.trim() || '',
resultAfterClose: document.getElementById('resultAfterClose').value.trim() || '',
};
// Use manual profit input with validation
const manualProfit = getNumberValue('profit');
if (manualProfit === null || isNaN(manualProfit)) {
alert("Please enter a valid profit value.");
return;
}
tradeData.profit = manualProfit;
tradeData.accountReward = calculateAccountReward(tradeData.profit);
const index = document.getElementById('tradeIndex').value;
if(index === '') {
trades.push(tradeData);
} else {
trades[index] = tradeData;
}
trades.sort((a, b) => (a.trade || 0) - (b.trade || 0));
saveAndRender();
});
```
---
### Summary:
- Profit input **editable and required**.
- Profit used as entered.
- Account Reward (%) recalculated based on profit.
- Actual Balance updates correctly.
- Other features unchanged.
---
If you want I can provide you the full complete updated full HTML file again with this manual profit edit enabled — just ask!65d56c25a06ae25b01e68bb6update and send all code
Certainly! Below is the **complete updated HTML** of your Trading Journal app with all your requested updates and **Profit as a manual input** field:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Trading Journal</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background: #f4f6f8;
}
/* Header Wrapper */
#headerWrapper {
max-width: 1100px;
margin: 0 auto 25px;
display: flex;
align-items: center;
justify-content: center;
gap: 25px;
flex-wrap: wrap;
}
#headerWrapper h1 {
margin: 0;
}
#headerWrapper label {
font-weight: bold;
font-size: 16px;
margin-right: 8px;
}
#headerWrapper input[type="number"] {
width: 120px;
padding: 5px 8px;
font-size: 16px;
}
#actualBalanceWrapper {
font-weight: bold;
font-size: 16px;
background-color: #007bff;
color: white;
padding: 6px 12px;
border-radius: 4px;
}
input[disabled] {
background-color: #e9ecef;
}
form {
background: white;
padding: 20px 30px;
border-radius: 8px;
margin-bottom: 30px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
form .grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px 40px;
align-items: center;
}
form .grid-container div {
display: flex;
align-items: center;
}
label {
width: 140px;
font-weight: bold;
margin-right: 12px;
white-space: nowrap;
}
input[type="text"],
input[type="number"],
input[type="time"],
input[type="date"],
select,
textarea {
flex: 1;
padding: 6px 8px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
min-width: 0;
}
textarea {
resize: vertical;
}
/* Full width fields: e.g. textareas or wide inputs below */
.full-width {
grid-column: 1 / -1;
margin-top: 10px;
}
/* Buttons */
button {
background-color: #007bff;
color: white;
border:none;
padding: 10px 16px;
cursor: pointer;
border-radius: 4px;
font-size: 16px;
}
button:disabled {
background-color: #aaa;
cursor: not-allowed;
}
button:hover:not(:disabled) {
background-color: #0056b3;
}
#buttonsWrapper {
margin-top: 20px;
display: flex;
justify-content: space-between;
max-width: 1100px;
margin-left: auto;
margin-right: auto;
gap: 10px;
flex-wrap: wrap;
}
/* Table styling */
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
th, td {
text-align: center;
padding: 8px;
border-bottom: 1px solid #ddd;
font-size: 13px;
vertical-align: middle;
word-break: break-word;
}
th {
background-color: #007bff;
color: white;
position: sticky;
top: 0;
z-index: 2;
}
tr:hover {
background-color: #f1f1f1;
}
.actions button {
background-color: #dc3545;
margin: 0 2px;
padding: 5px 8px;
font-size: 12px;
}
.actions button.edit {
background-color: #28a745;
}
#clearAllBtn {
background-color: #6c757d;
}
/* Responsive for smaller screens: stack form fields */
@media (max-width: 700px) {
form .grid-container {
grid-template-columns: 1fr;
}
label {
width: 110px;
}
#buttonsWrapper {
flex-direction: column;
gap: 10px;
}
#buttonsWrapper button {
width: 100%;
}
#headerWrapper {
justify-content: center;
}
}
</style>
</head>
<body>
<!-- Header with Balance and Actual Balance display -->
<div id="headerWrapper" aria-label="Account balances">
<h1>Trading Journal</h1>
<div>
<label for="initialBalance">Balance:</label>
<input type="number" id="initialBalance" min="0" step="100" aria-describedby="balanceDesc"/>
<div id="balanceDesc" style="font-weight:normal; font-size:12px; color: #555;">Initial account balance</div>
</div>
<div id="actualBalanceWrapper" aria-live="polite" title="Initial Balance plus all profits">Actual Balance: $<span id="actualBalance">0.00</span></div>
</div>
<form id="tradeForm" autocomplete="off" aria-label="Add or edit trade">
<input type="hidden" id="tradeIndex" />
<div class="grid-container">
<div>
<label for="trade">Trade #<sup style="color:red">*</sup></label>
<input type="number" id="trade" min="1" placeholder="e.g. 1" required aria-required="true" />
</div>
<div>
<label for="emaBias">M15 EMA's Bias</label>
<select id="emaBias" aria-label="M15 EMA's Bias">
<option value="">Select</option>
<option>Uptrend</option>
<option>Downtrend</option>
<option>Sideways</option>
</select>
</div>
<div>
<label for="day">Day (Date)<sup style="color:red">*</sup></label>
<input type="date" id="day" required aria-required="true" />
</div>
<div>
<label for="time">Time<sup style="color:red">*</sup></label>
<input type="time" id="time" required aria-required="true" />
</div>
<div>
<label for="symbol">Symbol<sup style="color:red">*</sup></label>
<input type="text" id="symbol" placeholder="e.g. EURUSD" required aria-required="true" />
</div>
<div>
<label for="session">Session When Open</label>
<select id="session" aria-label="Session When Open">
<option value="">Select</option>
<option>Asia</option>
<option>London</option>
<option>New York</option>
<option>Other</option>
</select>
</div>
<div>
<label for="risk">Risk %</label>
<input type="number" id="risk" min="0" step="0.01" placeholder="e.g. 1.5" />
</div>
<div>
<label for="rrr">RRR (Risk Reward Ratio)</label>
<input type="number" id="rrr" min="0" step="0.1" placeholder="e.g. 2" />
</div>
<div>
<label for="positionSize">Position Size<sup style="color:red">*</sup></label>
<input type="number" id="positionSize" min="0" step="0.01" placeholder="e.g. 0.5" required aria-required="true" />
</div>
<div>
<label for="mode">Mode<sup style="color:red">*</sup></label>
<select id="mode" required aria-required="true">
<option value="">Select</option>
<option>Buy</option>
<option>Sell</option>
</select>
</div>
<div>
<label for="entry">Entry Price<sup style="color:red">*</sup></label>
<input type="number" id="entry" min="0" step="0.0001" placeholder="e.g. 1.1234" required aria-required="true" />
</div>
<div>
<label for="sl">Stop Loss (SL)</label>
<input type="number" id="sl" min="0" step="0.0001" placeholder="e.g. 1.1200" />
</div>
<div>
<label for="tp">Take Profit (TP)</label>
<input type="number" id="tp" min="0" step="0.0001" placeholder="e.g. 1.1300" />
</div>
<div>
<label for="exitType">Exit Type<sup style="color:red">*</sup></label>
<select id="exitType" required aria-required="true">
<option value="">Select</option>
<option value="SL">Stop Loss (SL)</option>
<option value="TP">Take Profit (TP)</option>
<option value="Manual">Manual</option>
</select>
</div>
<div>
<label for="exit">Exit Price<sup style="color:red">*</sup></label>
<input type="number" id="exit" min="0" step="0.0001" placeholder="Price exited at" required aria-required="true" />
</div>
<div>
<label for="close">Close Price</label>
<input type="number" id="close" min="0" step="0.0001" placeholder="Only if manual exit" disabled />
</div>
<div class="full-width">
<label for="whyOpen" style="vertical-align: top;">Why Open</label>
<textarea id="whyOpen" rows="2" placeholder="Explain why you opened this trade"></textarea>
</div>
<div class="full-width">
<label for="feelings" style="vertical-align: top;">Feelings</label>
<textarea id="feelings" rows="2" placeholder="What were your emotions"></textarea>
</div>
<div>
<label for="closeRrr">Close RRR</label>
<input type="number" id="closeRrr" min="0" step="0.1" placeholder="Exit RRR" />
</div>
<div>
<label for="closeTime">Close Time</label>
<input type="time" id="closeTime" />
</div>
<div class="full-width">
<label for="whyCloseManual" style="vertical-align: top;">Why Close if Exit Manual</label>
<textarea id="whyCloseManual" rows="2" placeholder="Reason for manual exit"></textarea>
</div>
<div>
<label for="profit">Profit<sup style="color:red">*</sup></label>
<input type="number" id="profit" step="0.01" placeholder="Enter profit" required aria-required="true" aria-describedby="profitDesc" />
<div id="profitDesc" style="font-weight:normal; font-size:12px; color: #555;">Enter the profit manually</div>
</div>
<div>
<label for="accountReward">Account Reward (%)</label>
<input type="number" id="accountReward" step="0.0001" placeholder="Calculated automatically" disabled />
</div>
<div class="full-width">
<label for="resultAfterClose" style="vertical-align: top;">Result After Close if Exit Manual</label>
<textarea id="resultAfterClose" rows="3" placeholder="Notes after trade closes"></textarea>
</div>
</div>
<div id="buttonsWrapper">
<button type="submit" id="submitBtn">Add Trade</button>
<button type="button" id="clearAllBtn" title="Clear All Trades">Clear All</button>
<button type="button" id="exportBtn" title="Export all trades as CSV">Export Trades</button>
<button type="button" id="statsBtn" title="Go to statistics page">Stats</button>
</div>
</form>
<table id="tradesTable" aria-label="Trading journal records">
<thead>
<tr>
<th>Trade #</th>
<th>Day</th>
<th>Time</th>
<th>Symbol</th>
<th>Session</th>
<th>M15 EMA's Bias</th>
<th>Risk %</th>
<th>RRR</th>
<th>Position Size</th>
<th>Mode</th>
<th>Entry</th>
<th>SL</th>
<th>TP</th>
<th>Exit Type</th>
<th>Exit</th>
<th>Close</th>
<th>Close RRR</th>
<th>Close Time</th>
<th>Why Open</th>
<th>Feelings</th>
<th>Why Close If Manual</th>
<th>Profit</th>
<th>Account Reward (%)</th>
<th>Result After Close</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!-- Trades inserted by JS -->
</tbody>
</table>
<script>
const tradeForm = document.getElementById('tradeForm');
const tradesTableBody = document.querySelector('#tradesTable tbody');
const clearAllBtn = document.getElementById('clearAllBtn');
const submitBtn = document.getElementById('submitBtn');
const exportBtn = document.getElementById('exportBtn');
const statsBtn = document.getElementById('statsBtn');
const exitTypeEl = document.getElementById('exitType');
const closePriceEl = document.getElementById('close');
const sessionEl = document.getElementById('session');
const timeEl = document.getElementById('time');
const initialBalanceInput = document.getElementById('initialBalance');
const actualBalanceSpan = document.getElementById('actualBalance');
let initialBalance = Number(localStorage.getItem('initialBalance')) || 5000;
initialBalanceInput.value = initialBalance.toFixed(2);
// Load trades from localStorage or start empty array
let trades = JSON.parse(localStorage.getItem('trades')) || [];
// Auto-set session based on time input
function autoSelectSession(timeValue) {
if(!timeValue) {
sessionEl.value = "";
return;
}
const [h, m] = timeValue.split(':').map(Number);
const minutesTotal = h * 60 + m;
const asiaStart = 1 * 60;
const asiaEnd = 7 * 60;
const londonStart = 10 * 60;
const londonEnd = 12 * 60;
const nyStart = 15 * 60;
const nyEnd = 18 * 60;
if (minutesTotal >= asiaStart && minutesTotal <= asiaEnd) {
sessionEl.value = "Asia";
} else if (minutesTotal >= londonStart && minutesTotal <= londonEnd) {
sessionEl.value = "London";
} else if (minutesTotal >= nyStart && minutesTotal <= nyEnd) {
sessionEl.value = "New York";
} else {
sessionEl.value = "";
}
}
timeEl.addEventListener('input', e => {
autoSelectSession(e.target.value);
});
// Enable or disable Close Price input based on Exit Type
exitTypeEl.addEventListener('change', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
closePriceEl.required = true;
} else {
closePriceEl.disabled = true;
closePriceEl.value = '';
closePriceEl.required = false;
}
});
// On load, ensure correct Close Price input state if editing
window.addEventListener('DOMContentLoaded', () => {
if(exitTypeEl.value === 'Manual') {
closePriceEl.disabled = false;
closePriceEl.required = true;
} else {
closePriceEl.disabled = true;
closePriceEl.required = false;
}
});
// Update initial balance when user changes input
initialBalanceInput.addEventListener('input', () => {
let val = Number(initialBalanceInput.value);
if (isNaN(val) || val < 0) {
val = 5000;
}
initialBalance = val;
localStorage.setItem('initialBalance', initialBalance);
updateAccountRewardForAllTrades();
updateActualBalanceDisplay();
renderTrades();
});
// Calculate Account Reward % (profit relative to initial balance), 4 decimals
function calculateAccountReward(profit) {
if (profit === null || profit === undefined || isNaN(profit)) return '';
if(initialBalance === 0) return '';
return ((profit / initialBalance) * 100).toFixed(4);
}
// Update actual balance display (initial + sum of profits)
function updateActualBalanceDisplay() {
const totalProfit = trades.reduce((acc, trade) => acc + (trade.profit || 0), 0);
const actual = initialBalance + totalProfit;
actualBalanceSpan.textContent = actual.toFixed(2);
}
// Update accountReward for each trade in trades array based on manual profit
function updateAccountRewardForAllTrades() {
trades.forEach(trade => {
trade.accountReward = calculateAccountReward(trade.profit);
});
}
// Call once on load
updateAccountRewardForAllTrades();
updateActualBalanceDisplay();
// Render the trades table rows
function renderTrades() {
tradesTableBody.innerHTML = '';
if(trades.length === 0) {
const tr = document.createElement('tr');
const td = document.createElement('td');
td.colSpan = 25;
td.style.textAlign = 'center';
td.textContent = 'No trades recorded yet.';
tr.appendChild(td);
tradesTableBody.appendChild(tr);
updateActualBalanceDisplay();
return;
}
trades.forEach((trade, index) => {
const tr = document.createElement('tr');
const fields = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose,
];
fields.forEach(field => {
const td = document.createElement('td');
td.textContent = (field === undefined || field === null) ? '' : field;
td.title = td.textContent;
tr.appendChild(td);
});
// Color code profit column: green positive, red negative
const profitTd = tr.children[20];
if(profitTd && profitTd.textContent !== '') {
const profitVal = Number(profitTd.textContent);
profitTd.style.color = profitVal >= 0 ? 'green' : 'red';
}
const actionsTd = document.createElement('td');
actionsTd.className = 'actions';
const editBtn = document.createElement('button');
editBtn.textContent = 'Edit';
editBtn.className = 'edit';
editBtn.type = 'button';
editBtn.title = "Edit trade";
editBtn.addEventListener('click', () => {
populateFormForEdit(index);
window.scrollTo(0, 0);
});
const delBtn = document.createElement('button');
delBtn.textContent = 'Delete';
delBtn.type = 'button';
delBtn.title = "Delete trade";
delBtn.addEventListener('click', () => {
if(confirm(`Are you sure you want to delete trade #${trade.trade}?`)) {
trades.splice(index, 1);
saveAndRender();
}
});
actionsTd.appendChild(editBtn);
actionsTd.appendChild(delBtn);
tr.appendChild(actionsTd);
tradesTableBody.appendChild(tr);
});
updateActualBalanceDisplay();
}
// Save to localStorage and render
function saveAndRender() {
localStorage.setItem('trades', JSON.stringify(trades));
renderTrades();
tradeForm.reset();
submitBtn.textContent = 'Add Trade';
document.getElementById('tradeIndex').value = '';
closePriceEl.disabled = true;
closePriceEl.required = false;
// Reset session auto set based on time (cleared)
sessionEl.value = "";
// Re-set initialBalance input (should already be set)
initialBalanceInput.value = initialBalance.toFixed(2);
updateActualBalanceDisplay();
}
function populateFormForEdit(index) {
const trade = trades[index];
document.getElementById('tradeIndex').value = index;
document.getElementById('trade').value = trade.trade || '';
document.getElementById('day').value = trade.day || '';
document.getElementById('time').value = trade.time || '';
document.getElementById('symbol').value = trade.symbol || '';
document.getElementById('session').value = trade.session || '';
document.getElementById('emaBias').value = trade.emaBias || '';
document.getElementById('risk').value = trade.risk || '';
document.getElementById('rrr').value = trade.rrr || '';
document.getElementById('positionSize').value = trade.positionSize || '';
document.getElementById('mode').value = trade.mode || '';
document.getElementById('entry').value = trade.entry || '';
document.getElementById('sl').value = trade.sl || '';
document.getElementById('tp').value = trade.tp || '';
document.getElementById('exitType').value = trade.exitType || '';
document.getElementById('exit').value = trade.exit || '';
document.getElementById('close').value = trade.close || '';
document.getElementById('closeRrr').value = trade.closeRrr || '';
document.getElementById('closeTime').value = trade.closeTime || '';
document.getElementById('whyOpen').value = trade.whyOpen || '';
document.getElementById('feelings').value = trade.feelings || '';
document.getElementById('whyCloseManual').value = trade.whyCloseManual || '';
document.getElementById('profit').value = trade.profit || '';
document.getElementById('accountReward').value = trade.accountReward || '';
document.getElementById('resultAfterClose').value = trade.resultAfterClose || '';
// Set Close Price enabled state according to exitType
closePriceEl.disabled = trade.exitType === 'Manual' ? false : true;
closePriceEl.required = trade.exitType === 'Manual';
submitBtn.textContent = 'Update Trade';
}
tradeForm.addEventListener('submit', e => {
e.preventDefault();
function getNumberValue(id) {
const v = document.getElementById(id).value;
return v === '' ? null : Number(v);
}
// Validation of required fields (including profit)
const requiredFields = [
{id: 'trade', name: 'Trade #'},
{id: 'day', name: 'Day (Date)'},
{id: 'time', name: 'Time'},
{id: 'symbol', name: 'Symbol'},
{id: 'positionSize', name: 'Position Size'},
{id: 'mode', name: 'Mode'},
{id: 'entry', name: 'Entry Price'},
{id: 'exitType', name: 'Exit Type'},
{id: 'profit', name: 'Profit'},
];
for (const field of requiredFields) {
const val = document.getElementById(field.id).value;
if (!val || val.trim() === '') {
alert(`Please fill out required field: ${field.name}`);
return;
}
}
if(exitTypeEl.value === 'Manual' && (!closePriceEl.value || closePriceEl.value.trim() === '')) {
alert("Close Price is required for Manual exit type.");
return;
}
// Validate numeric fields have valid numbers if not empty
const numberFields = ['risk','rrr','positionSize','entry','sl','tp','exit','close','closeRrr','profit'];
for (const nf of numberFields) {
const val = document.getElementById(nf).value;
if(val) {
const num = Number(val);
if(isNaN(num)) {
alert(`Field ${nf} must be a valid number.`);
return;
}
}
}
let tradeData = {
trade: getNumberValue('trade'),
day: document.getElementById('day').value || '',
time: document.getElementById('time').value || '',
symbol: document.getElementById('symbol').value.trim() || '',
session: document.getElementById('session').value,
emaBias: document.getElementById('emaBias').value,
risk: getNumberValue('risk'),
rrr: getNumberValue('rrr'),
positionSize: getNumberValue('positionSize'),
mode: document.getElementById('mode').value,
entry: getNumberValue('entry'),
sl: getNumberValue('sl'),
tp: getNumberValue('tp'),
exitType: document.getElementById('exitType').value,
exit: getNumberValue('exit'),
close: getNumberValue('close'),
closeRrr: getNumberValue('closeRrr'),
closeTime: document.getElementById('closeTime').value || '',
whyOpen: document.getElementById('whyOpen').value.trim() || '',
feelings: document.getElementById('feelings').value.trim() || '',
whyCloseManual: document.getElementById('whyCloseManual').value.trim() || '',
profit: getNumberValue('profit'),
accountReward: '',
resultAfterClose: document.getElementById('resultAfterClose').value.trim() || '',
};
// Validate manual profit input
if (tradeData.profit === null || isNaN(tradeData.profit)) {
alert("Please enter a valid profit value.");
return;
}
tradeData.accountReward = calculateAccountReward(tradeData.profit);
const index = document.getElementById('tradeIndex').value;
if(index === '') {
trades.push(tradeData);
} else {
trades[index] = tradeData;
}
// Sort trades by trade number ascending
trades.sort((a, b) => (a.trade || 0) - (b.trade || 0));
saveAndRender();
});
clearAllBtn.addEventListener('click', () => {
if(confirm('Are you sure you want to delete all trades? This action cannot be undone.')) {
trades = [];
saveAndRender();
}
});
// Helper to escape CSV values properly (quote if needed)
function csvEscape(value) {
if (value === null || value === undefined) return '';
const str = String(value);
if(str.includes('"') || str.includes(',') || str.includes('\n') || str.includes('\r')) {
return `"${str.replace(/"/g, '""')}"`;
}
return str;
}
// Export trades as CSV
function exportTradesToCSV() {
if (trades.length === 0) {
alert('No trades to export.');
return;
}
const headers = [
"Trade #",
"Day",
"Time",
"Symbol",
"Session",
"M15 EMA's Bias",
"Risk %",
"RRR",
"Position Size",
"Mode",
"Entry",
"SL",
"TP",
"Exit Type",
"Exit",
"Close",
"Close RRR",
"Close Time",
"Why Open",
"Feelings",
"Why Close If Manual",
"Profit",
"Account Reward (%)",
"Result After Close"
];
let csvContent = headers.map(csvEscape).join(",") + "\r\n";
trades.forEach(trade => {
const row = [
trade.trade,
trade.day,
trade.time,
trade.symbol,
trade.session,
trade.emaBias,
trade.risk,
trade.rrr,
trade.positionSize,
trade.mode,
trade.entry,
trade.sl,
trade.tp,
trade.exitType,
trade.exit,
trade.close,
trade.closeRrr,
trade.closeTime,
trade.whyOpen,
trade.feelings,
trade.whyCloseManual,
trade.profit,
trade.accountReward,
trade.resultAfterClose
].map(csvEscape);
csvContent += row.join(",") + "\r\n";
});
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'trades_export.csv';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 0);
}
exportBtn.addEventListener('click', exportTradesToCSV);
// Stats button to go to stats.htm
statsBtn.addEventListener('click', () => {
window.location.href = 'stats.htm';
});
renderTrades();
</script>
</body>
</html>
```
---
### How to use:
- **Manually enter Profit** value before submitting.
- The **Account Reward (%)** and **Actual Balance** update automatically on submit or when initial balance changes.
- All other functionality remains as you requested.
- Stats button navigates you to `stats.htm`.
- Trades are automatically sorted and saved in localStorage.
Open this file in a modern browser, and your trading journal app is ready!
If you want help building stats.htm or further customizations, just let me know!d0127764b59051ca8e387005Trade # Day Time Symbol Session M15 EMA's Bias Risk % RRR Position Size Mode Entry SL TP Exit Type Exit Close Close RRR Close Time Why Open Feelings Why Close If Manual Profit Account Reward (%) Result After Close Actions 1 2025-06-23 08:45 DAX Other Downtrend 0.5 0.04 Sell 23228.25 Manual 23224.55 20:45 1.7 0.0330 EditDelete 2 2025-06-23 08:48 Downtrend 0.5 0.03 Buy 23234.55 23174.9 23291.47 SL 09:25 -20.6 -0.4002 EditDelete arange this area nicely,
Certainly! To present your data in a nicely formatted and aligned table area like your sample, you want improved table styling with clearer column widths, spacing, and perhaps wrapping for text-heavy columns.
Here’s how to layout the table so the columns fit better and the content is easier to read:
1. **Use fixed column widths for key columns** like Trade #, Date, Time, etc.
2. Use `word-break: break-word;` and `white-space: normal` on columns with longer text (like "Why Open" and "Feelings")
3. Increase vertical padding for readability.
4. For `Actions`, keep buttons nicely spaced.
5. Optionally, add horizontal scrolling for very small screens or wide tables.
---
Below is an improved CSS snippet for the `<table>`, **focusing mostly on the columns and their widths and better wrapping**, integrated into your earlier CSS:
```css
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: auto; /* allow horizontal scroll if needed */
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 1100px;
margin-left: auto;
margin-right: auto;
table-layout: fixed; /* Fixed layout for consistent column widths */
}
th, td {
padding: 10px 6px;
border-bottom: 1px solid #ddd;
font-size: 13px;
vertical-align: middle;
word-break: break-word;
white-space: normal;
text-align: center;
}
/* Set widths (approximate) for columns */
th:nth-child(1),
td:nth-child(1) { width: 45px; } /* Trade # */
th:nth-child(2),
td:nth-child(2) { width: 90px; } /* Day */
th:nth-child(3),
td:nth-child(3) { width: 60px; } /* Time */
th:nth-child(4),
td:nth-child(4) { width: 70px; } /* Symbol */
th:nth-child(5),
td:nth-child(5) { width: 75px; } /* Session */
th:nth-child(6),
td:nth-child(6) { width: 85px; } /* EMA Bias */
th:nth-child(7),
td:nth-child(7) { width: 50px; } /* Risk % */
th:nth-child(8),
td:nth-child(8) { width: 50px; } /* RRR */
th:nth-child(9),
td:nth-child(9) { width: 85px; } /* Position Size */
th:nth-child(10),
td:nth-child(10) { width: 60px; } /* Mode */
th:nth-child(11),
td:nth-child(11) { width: 80px; } /* Entry */
th:nth-child(12),
td:nth-child(12) { width: 80px; } /* SL */
th:nth-child(13),
td:nth-child(13) { width: 80px; } /* TP */
th:nth-child(14),
td:nth-child(14) { width: 90px; } /* Exit Type */
th:nth-child(15),
td:nth-child(15) { width: 80px; } /* Exit */
th:nth-child(16),
td:nth-child(16) { width: 80px; } /* Close */
th:nth-child(17),
td:nth-child(17) { width: 65px; } /* Close RRR */
th:nth-child(18),
td:nth-child(18) { width: 75px; } /* Close Time */
/* Wrap text nicely on these often longer text columns */
th:nth-child(19),
td:nth-child(19), /* Why Open */
th:nth-child(20),
td:nth-child(20), /* Feelings */
th:nth-child(21),
td:nth-child(21), /* Why Close If Manual */
th:nth-child(24),
td:nth-child(24) /* Result After Close */
{
width: 150px;
white-space: normal;
text-align: left;
padding-left: 8px;
padding-right: 8px;
}
/* Profit & Account Reward (%) columns */
th:nth-child(22),
td:nth-child(22), /* Profit */
th:nth-child(23),
td:nth-child(23) /* Account Reward (%) */
{
width: 90px;
}
/* Actions column */
th:nth-child(25),
td:nth-child(25) {
width: 100px;
white-space: nowrap;
padding-left: 8px;
padding-right: 8px;
}
tr:hover {
background-color: #f1f1f1;
}
.actions button {
background-color: #dc3545;
margin: 0 4px;
padding: 5px 10px;
font-size: 12px;
border-radius: 3px;
cursor: pointer;
border: none;
color: white;
min-width: 45px;
}
.actions button.edit {
background-color: #28a745;
}
.actions button:hover {
opacity: 0.9;
}
/* Responsive: horizontal scroll if narrow screen */
@media (max-width: 900px) {
table {
display: block;
overflow-x: auto;
white-space: nowrap;
}
th, td {
white-space: nowrap;
}
}
```
---
### How to add:
Replace your existing table-related CSS in the `<style>` section with the above snippet.
This CSS:
- Fixes columns widths for good alignment.
- Wraps long text columns nicely.
- Keeps profits and numbers aligned properly.
- Makes the action buttons nicely spaced and clickable.
- Adds horizontal scrolling on smaller screens for usability.
---
### Result for your example data
Here’s what your sample data will look like visually:
| Trade # | Day | Time | Symbol | Session | M15 EMA's Bias | Risk % | RRR | Position Size | Mode | Entry | SL | TP | Exit Type | Exit | Close | Close RRR | Close Time | Why Open | Feelings | Why Close If Manual | Profit | Account Reward (%) | Result After Close | Actions |
|---------|-----------|-------|--------|---------|----------------|--------|------|---------------|------|----------|--------|---------|-----------|----------|----------|-----------|------------|----------|----------|--------------------|--------|--------------------|--------------------|---------------|
| 1 | 2025-06-23| 08:45 | DAX | Other | Downtrend | 0.5 | | 0.04 | Sell | 23228.25 | | | Manual | 23224.55 | | | 20:45 | | | | 1.7 | 0.0330 | | Edit Delete |
| 2 | 2025-06-23| 08:48 | | | Downtrend | 0.5 | | 0.03 | Buy | 23234.55 |23174.9 | 23291.47 | SL | | | | 09:25 | | | | -20.6 | -0.4002 | | Edit Delete |
---
If you want me to create an entire minimal HTML snippet with sample data and this styling applied for you to test visually, just ask! Otherwise simply add the CSS above to your existing page’s `<style>` section.f02254397e2a80807416cb7bUser: Generate a welcome message User: Generate a welcome message Assistant:
Welcome! We're glad to have you here. If you need any assistance or have questions, feel free to ask. Enjoy your time!